통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34043 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 코딩에 도움되는 비주얼 스튜디오 기능   | VC++ 일반 2018-05-16 오후 10:53:39
 kyh2984@hotmail.com  kyh2984@hotmail.com님께 메시지 보내기kyh2984@hotmail.com님을 내 주소록에 추가합니다.kyh2984@hotmail.com님의 개인게시판 가기 번호: 8882 추천:1  / 읽음:5,585

좋은 연장을 이용한 결과물은 그렇지 않은 연장을 이용해서 나온 같은 결과물 보다 생산성이 높은 것이 일반적이다. Visual Studio는 버전이 올라갈수록 프로그램 작성시 프로그래머에게 도움이 되는 여러 가지 기능들을 제공하는데, 최근 프로그램은 크기가 커지는 등의 프로그램 추세가 반영된 기능들을 제공하지만, 프로그래머의 습관과 실수를 분석해 도움을 줄 수 있는 기능을 만들어 놓은 경우도 있다.

 

일반적으로 프로그래머는 디버깅과 결과물의 품질을 높이기 위한 IDE 및 Visual Studio의 기능을 찾는데는 적극적이지만, 그 외의 부가적인 옵션은 접할 기회가 없어 활용되지 못하는 경향이 있다. 여기 도움이 될 만한 몇 가지 옵션 및 단축키와 기능을 소개한다.

 

함수의 상관관계를 비주얼하게 표시해 주는 call browser

Call browser는 함수를 호출하거나 호출한 소스코드의위치를 얻을 수 있는 기능이다. 프로젝트 크기가 적당하고 소스코드 분석을 시작할 때 유용하게 사용할 수 있다.

 

void foo() { }

void callFoo() { foo(); }

void callFoo2() { foo(); }

int _tmain(int argc, _TCHAR* argv[]) {

  callFoo();

  return 0;

}

Call browser 테스트를 위한 소스 예

 

테스트 소스코드에서 foo()나 callFoo2() 함수에서 오른쪽 버튼을 눌러 나오는 컨텍스트 메뉴 중 View Call Hierarchy를 선택한다.

 

C

 

비주얼 스튜디오 버전에 따라 Call Graph와 Callers Graph를 선택할 수도 있다.

View Call Hierarchy를 선택하면 Call Hierarchy Windows에 아래와 같은 그래프를 얻을 수 있다. 선택한 함수에서 호출하고 함수를 호출한 함수의 목록의 트리와 자세한 정보가 오른쪽에 나온다.

 

 

비주얼 스튜디오의 버전에 따라 Call Graph와 Callers Graph가 분리되어 있는 경우도 있다. 얻을 수 있는 정보와 활용성은 동일하다.

 

 

현재 라인을 아래쪽으로 내리기

Alt + Shift + T를 누르면 현재 라인과 아랫 라인을 교체 하면서 포커스를 아래 라인으로 가져다 준다. 이 기능을 이용하면 잘라내기 후 복사할 곳에 자리를 잡고 라인피드를 입력한 후 붙여 넣기를 하는 과정을 생략한 채 화면에서 현재 라인을 아래쪽으로 내리는 듯한 효과를 주면서 소스 편집을 할 수 있게 된다.

 

단어를 대문자로 변경하기

인텔리센스가 없다면 프로그래밍 하기에 많이 불편할 것이다. 인텔리센스는 CPU점유를 많이 하고, 잘못된 동작을 하는 등의 오류로 인해서 일부 그룹에서는 환영 받지 못하기도 하지만, 복잡하고 긴 API명이나 상수명 대신 3글자에서 4글자정도만 입력하면 원하는 긴 단어를 입력할 수 있기 때문에 프로그래밍의 효율성을 높여주어 보편적으로 사용된다. 하지만 인텔리센스 특성상 이름이 모호하거나 유사한 상수명이나 함수명이 존재하거나 소스의 덩치가 커질수록 프로그래머가 의도하지 않는 동작을 할 때가 있다. 일반적으로 상수나 플래그 변수는 대문자로 이루어져 있는데, 소문자를 입력하면서 인텔리센스를 활용하다가 인텔리 센스를 통한입력이 실패할 경우 소문자로 상수등의 단어가 입력되는 경우가 있다. 이런 경우 단어를 대문자로 변경하는 기능을 사용할 수 있는데, 변경할 영역을 선택 한 후 Ctrl + Shift + U를 누르면 해당 단어가 대문자로 변경되게 된다. 반대로 소문자로 변경하는 것은 Ctrl + Shift + L이 아닌 Ctrl + U임에 주의한다.

 

빌드시간 및 환경변수 표시

적당한 크기의 파일을 전송하거나 중간 용량의 메모리를 포멧하는 등 몇 십초 정도의 적당한 기다리는 시간이 있을 때 사람들은 무엇을 할까. 이에 대한 사용성 조사를 했더니 대부분의 사람들이 올라가는 프로그래스 바를 계속 처다보고 있었다고 한다. 광고를 상/하단에 위치시킬께 아니라 프로그래스바 위에 올려야 하지 않을까.

비슷한 관점으로 빌드를 시작 하면 Ouput 창에 빌드 관련 로그가 나오게 되고, 이 로그를 보고 있는 개발자가 많다. 또는 메뉴 > View > Error List를 선택해 Error List창의 에러와 워닝을 보면서 코딩상 문제점이 없는지 쉽게 점검하기도 한다.

 

 

빌드 로그에 빌드시간이 얼마나 걸렸는지 표시해 줄 수 있다.

 

아래와 같이 표시되는 빌드 로그가,

1>------ Rebuild All started: Project: cppTest, Configuration: Debug x64 ------

1>stdafx.cpp

1>cppTest.cpp

1>cppTest.vcxproj -> C:\temp\cppTest.exe

========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

 

메뉴 > Tools > Options > Projects and Solutions > VC++ Project Settings에 Build Timing을 Yes로 변경하면

 

1>------ Rebuild All started: Project: cppTest, Configuration: Debug x64 ------

1>stdafx.cpp

1>cppTest.cpp

1>cppTest.vcxproj -> C:\temp\cppTest\x64\Debug\cppTest.exe

1>

1>Project Performance Summary:

1>     1424 ms  C:\temp\cppTest\cppTest\cppTest.vcxproj    1 calls

1>

1>Target Performance Summary:

1>        0 ms  Rebuild                                    1 calls

// ...

1>       16 ms  CoreCppClean                               1 calls

1>       82 ms  SetCABuildNativeEnvironmentVariables       1 calls

1>      282 ms  AppLocalFromInstalled                      1 calls

1>      380 ms  Link                                       1 calls

1>      596 ms  ClCompile                                  1 calls

========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

 

이렇게 빌드시간이 나온다.

 

 

메뉴 > Tools > Options > Projects and Solutions > VC++ Project Settings에 Show Environment In Log를 변경하면

 

1>------ Rebuild All started: Project: cppTest, Configuration: Debug x64 ------

1>Environment at start of build:

1>ALLUSERSPROFILE                = C:\ProgramData

1>ComSpec                        = C:\WINDOWS\system32\cmd.exe

1>CUDA_PATH                      = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1

1>CUDA_PATH_V9_1                 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1

1>VisualStudioDir                = C:\Users\john\Documents\Visual Studio 2017

1>VisualStudioEdition            = Microsoft Visual Studio Professional 2017

1>VisualStudioVersion            = 15.0

1>VS140COMNTOOLS                 = C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\

1>VSAPPIDDIR                     = C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\

1>VSAPPIDNAME                    = devenv.exe

1>VSLANG                         = 1033

1>VSSKUEDITION                   = Professional

1>windir                         = C:\WINDOWS

1>stdafx.cpp

1>cppTest.cpp

1>cppTest.vcxproj -> C:\temp\cppTest\x64\Debug\cppTest.exe

========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

 

이와 같이 환경변수를 함께 볼 수 있다.

 

프로젝트에 포함된 C파일, 빌드에서 제외시키고 싶은 파일이 있을 때

 

일반적으로 프로젝트에 포함된 헤더파일은 .h로 소스코드는 .cpp나 .hpp로 만들게 된다. CUDA 프로젝트 등 예외인 경우도 있고 Visual C++의 컴파일러는 C/C++ 기능을 모두 지원하지만 .cpp 파일에서 C++과 호환되는 문법으로 개발한다.

엄밀히 말해 C와 C++ 문법은 서로 다른 부분이 있기 때문에 100% 호환되지는 않는다. 따라서, 외부 C 소스코드에서 복사한 소스코드나 .cpp 파일에서 일부만 수정할 경우 C++ 컴파일러로 컴파일이 되지 않을 때가 있다.

비주얼 스튜디오의 기능을 잘 모를경우, 이런 상황에서 C 코드 부분을 별도로 분리해서, 혹은 .cpp로 되어 있는 확장자를 모두 .c 파일로 바꾸어 컴파일 한다.

물론 이렇게 컴파일해도 문제 없지만 확장자와 관계 없이 비주얼 스튜디오에서 해당 파일을 C코드로 인식 시켜주면 된다. 옵션은 솔루션 탐색기에서 변경하고자하는 파일에서 우측버튼을 눌러 컨텍스트 메뉴의 속성창에서 Configuration Properties > C/C++ > Advanced > Compile As에서 찾을 수 있으며 Default를 선택할 경우 확장자를 따라 .cpp는 C++ 컴파일러가, .c는 C 컴파일러로 컴파일되며 이를 임의로 변경할 수 있다.

 

 

 

만일 임의의 확장자 파일을 헤더파일로 인식시키기 위해서는 마찬가지로 파일의 속성에서 Configuration Properties > General > Item Type을 변경해 준다. 확장자가 무엇이든 관계 없이 비주얼 스튜디오가 인식하는 아이템 타입을 임의로 부여할 수 있다.

 

프로젝트를 진행하다 보면 임의의 파일을 프로젝트에 포함하여 솔루션 익스프롤러에서 확인하고 싶지만 빌드는 하고 싶지 않을 때가 있다. 이런 상황에서 경험있는 개발자는 몇가지 노하우가 있는데, 간단하게 파일의 옵션에서 Configuration Properties > General > Excluded From Build를 선택하면 해당 파일을 빌드에서 제외시킬 수 있다.

 

 

컨텍스트 메뉴에서 찾을 수 있는 Exclude From Project와는 다르다. 이는 아예 프로젝트에서 해당 파일을 빼어 솔루션 익스플로러에서 제외시킨다.

 

CPP파일과 .H 파일 토글 시키기

.CPP파일과 .H파일을 토글 시키는 이유는 일반적으로 함수의 선언부와 함수의 정의부를 서로 찾아가기 위해서 이다.

함수의 선언부, 정의부를 찾기위한 단축키는 F12, Ctrl+F12, Alt + F12, Ctrl+Alt+F12를 이용한다. 코드에서 특정 함수 foo()를 사용하고 있을 때, 코드의 함수위치에 커서를 가져다 놓고 F12를 누르면 함수의 몸체가 구현된 보통 .cpp 파일인 정의부로 점프하게 된다. Ctrl+F12는 보통 .h파일인 선언부로 이동하며 Ctrl+Alt+F12와 같다.

Alt+F12는 Peek Window를 통해 빠르게 함수의 정의부를 확인할 수 있다. Peek Windows를 없애는건 ESC키로 간단히 할 수 있다. 습관들이면 매우 편리하게 코드를 파악하는데 도움이 된다.

 

상수값 조정등 기능 이용하기 위해서 사용은 CTRL K O

소스코드창에서 우측버튼 컨텍스트 메뉴에서 선택

 

하지만 다양한 이유 때문에 .h파일과 .cpp 파일을 토글해야 할 때가 있다. 단축키는 Ctrl+K+O인데, F12 계열 3종 셋트와 함께 자주 사용하는 단축키 이므로 손에 익숙해 지면 좋다. 비주얼 스튜디오 자체적으로 토글 기능을 제공해 준 것은 비주얼 스튜디오 2013 버전 부터이다.

비주얼 스튜디오 2008, 2010에서는 마우스 우측버튼의 컨텍스트 메뉴를 통해 Go To Header File을 이용할 수 있다. 비주얼 스튜디오 2013 이전버전들에서는 단축키 사용을 위해 비주얼 어시스트를 많이들 사용했다. 비주얼 어시스트의 Open Corresponding File 기능이며 ALT + O가 단축키다.

 

비주얼 어시스트를 이용하지 않고 헤더파일과 소스코드간에 토글하는 방법으로 매크로를 등록하고 단축키를 사용 하기도 한다.

 

‘=====================================================================

If the currently open document is a CPP or an H file, attempts to

switch between the CPP and the H file.

‘=====================================================================

Public Sub SwitchBetweenSourceAndHeader()

  Dim currentDocument As String

  Dim targetDocument As String

 

  currentDocument = ActiveDocument.FullName

 

  If currentDocument.EndsWith(“.cpp”, StringComparison.InvariantCultureIgnoreCase) Then

    targetDocument = Left(currentDocument, Len(currentDocument) - 3) + “h”

    OpenDocument(targetDocument)

  ElseIf currentDocument.EndsWith(“.h”, StringComparison.InvariantCultureIgnoreCase) Then

    targetDocument = Left(currentDocument, Len(currentDocument) - 1) + “cpp”

    OpenDocument(targetDocument)

  End If

 

End Sub

 

‘=====================================================================

Given a document name, attempts to activate it if it is already open,

‘ otherwise attempts to open it.

‘=====================================================================

Private Sub OpenDocument(ByRef documentName As String)

  Dim document As EnvDTE.Document

  Dim activatedTarget As Boolean

  activatedTarget = False

 

  For Each document In Application.Documents

    If document.FullName = documentName And document.Windows.Count > 0 Then

      document.Activate()

      activatedTarget = True

      Exit For

    End If

  Next

  If Not activatedTarget Then

    Application.Documents.Open(documentName, “Text”)

  End If

End Sub

 

 

코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.