Some Time-Saving Commands and Key Remappings for the VC IDE

Save time and impress co-workers with these great keyboard shortcuts

------------------------------------------------------------------------------------------------------------

Over many months of using VC 6, I've come up with a few keyboard shortcuts that are really handy,
 save a few seconds here and there, and really impress co-workers. Many of the commands aren't
apparent, and you wouldn't even know some of them existed unless you went through the entire
command list on the Keyboard tab in the Tools-Customize dialog.

 

VC 6 수개월 넘도록 사용하면서, 필자는 정말 편리한 키보드 단축키를 사용하여, 여기저기서 시간을 절약하고,
동료 작업자들에게 깊은 인상을 주었다. 많은 명령들이 명백하지 않아서, 여러분은 이것들 몇몇은 존재하는지 조차도
알지 못했을 있다. Tools-Customize 대화상자에 있는 키보드 탭에서 모든 명령리스트를 살펴보았다면 모르지만.

 

The first table lists the commands that I can't live without and use all the time. The second table lists
 commands I don't use quite as often, but which I still find handy. Commands marked as "built-in"
already have the listed keyboard assignment. For the other commands, you'll need to map the keys
yourself.

 

번째 표는 필자가 항상 사용하며, 이것들 없이는 못사는 명령들의 리스트이다. 번째 표는 필자가 아주 자주 사용하지
않지만, 여전히 편리하다고 생각하는 명령들의 리스트이다. “built-in”이라고 표시된 명령들은 이미 키보드가 할당되어
있는
것들이다. 그렇지 않은 명령들을 사용하기 위해서는, 여러분이 직접 키를 매핑해주어야 한다.

 

Must-Have Commands

Key

Command

Description

Ctrl+Shift+up arrow

WBGoToPrevious

Moves to the previous function in the current file.

현재 파일에서 이전 함수로 이동

Ctrl+Shift+down arrow

WBGoToNext

Moves to the next function in the current file.

현재 파일에서 다음 함수로 이동

Ctrl+Shift+G

FileGoTo (built-in)

If the cursor is over a filename, opens that file. Usually you move the cursor up to an #include line and then use this command.

커서가 파일 이름 위에 있다면 파일을 연다. 커서를 #include 라인에 놓은 명령을 사용하라.

Ctrl+Shift+H

WBOpenInclude

Brings up a dialog listing all headers #include'd in the current file. Select a header and it will be opened.

현재 파일에 #include되어있는 모든 헤더파일의 리스트를 가지는 대화상자를 연다. 헤더를 선택하면, 열릴 것이다.

Ctrl+I

SearchIncremental (built-in)

Begins an incremental search. Press these keys and then start typing the text to search for. The caret will move through the file as you type. Hit Enter to leave search mode. You can then use the other search keys (like F3) to continue searching for the same text.

점진적인 검색, 키를 누르고 검색할 텍스트를 타이핑하기 시작하라. 캐럿이 여러분이 타이핑하는 대로 파일 내에서 움직일 것이다. 검색 모드를 끝내려면 엔터를 눌러라. 여러분은 다른 검색 (F3 같은) 사용하여 같은 텍스트에 대해 검색을 계속할 있다.

Ctrl+Shift+F7

BuildRebuildAll

Rebuilds all files in the current project.

현재 프로젝트의 모든 파일을 리빌드한다.

Ctrl+F3

FindNextWord (built-in)

Finds the next occurrence of the word that the caret is currently over.

캐럿이 현재 위치한 곳의 단어가 다시 나타나는 곳으로 이동한다.

Ctrl+Shift+F3

FindPrevWord (built-in)

Same as Ctrl+F3, but searches backwards.

Ctrl+F3 같지만, 뒤쪽으로 검색한다.

Alt+F7

ProjectSettings (built-in)

Opens the project settings dialog.

프로젝트 세팅 다이얼로그를 연다.

Alt+Num *

DebugShowNextStatement (built-in)

Moves the caret to the next statement to be executed (only when broken in debug mode).

캐럿을 실행될 다음 문장으로 이동한다. (디버그 모드에서 멈췄을 때에만 사용가능)

Shift+Num *

DebugShowNextStatement

I add this key mapping because it's possible to type with one hand, while the previous one isn't. Yes, I'm lazy. :)

필자는 키를 매핑했다. 왜냐하면 한손으로 타이핑할 있기 때문이다. 원래 것은 그럴 없다. 그래 게으르당.

Ctrl+Shift+F9

DebugRemoveAllBreakpoints (built-in)

Deletes all breakpoints.

모든 중지점을 삭제한다.

Ctrl+Alt+Shift+F9

DebugDisableAllBreakpoints

Disables all breakpoints.

모든 중지점을 사용 불가능하게 한다.

Ctrl+M

CheckMnemonicKeys (built-in)

Checks for duplicate shortcut keys in a dialog or menu.

다이얼로그나 메뉴에서 중복되는 단축키를 체크한다.

 

Other Time-Savers

Key

Command

Description

Ctrl+Enter

LineOpenBelow

Opens a blank line below the current line and moves the caret to the new line.

현재 라인 아래에 라인을 만들고 라인으로 캐럿을 이동시킨다.

Ctrl+Shift+F8

SelectColumn (built-in)

Begins a selection - move the caret to select columns of text. Easier than Alt-dragging.

선택을 시작한다. – 텍스트 컬럼을 선택하려면 캐럿을 이동하라. Alt-드래깅 보다 쉽다.

Ctrl+Shift+S

FileSaveAll

Saves all open files.

열려있는 모든 파일 저장

Alt+F8

SelectionFormat (built-in)

Formats the selected text according to your indentation preferences. Great for when you cut & paste code out of MSDN and the code loses its indentation.

여러분의 들여쓰기 설정에 따라 선택된 텍스트의 포맷을 바꾼다. MSDN에서 코드를 복사해 붙여넣을 매우 좋다. 코드는 원래의 들여쓰기를 잃어버릴 것이다.

Ctrl+Alt+up arrow

LevelUp

Moves to the previous occurrence of a start of a block (for instance, the next left brace).

블록 시작의 처음으로 이동한다. (예를 들어, 다음 왼쪽 중괄호로 이동)

Ctrl+Alt+down arrow

LevelDown

Moves to the next occurrence of an end of a block (for instance, the next right brace).

블록의 끝으로 이동한다. (예를 들어 다음 오른쪽 중괄호로 이동)

Ctrl+Shift+X

CutAppendNext

Press these keys right before a cut (Ctrl+X) to append the cut text to the end of the clipboard.

잘라내기(Ctrl+X)하기 바로 전에 키를 사용하여 잘라낸 텍스트를 클립보드의 끝에 추가한다.

Ctrl+E

GoToMatchBrace (built-in)

If the caret is over a parenthesis, bracket, or brace, moves the caret to the matching character.

캐럿이 괄호, 꺽쇠괄호, 중괄호에 있을 , 매칭되는 문자로 캐럿을 이동한다.

Ctrl+Shift+E

GoToMatchBraceExtend (built-in)

Same as Ctrl+E, but selects the text between the matching characters as well.

Ctrl+E 같다. 하지만 매칭되는 문자 사이에 있는 텍스트를 선택한다.

Ctrl+Shift+T

WindowScrollToTop

Scrolls the window so the current line is at the top of the window.

현재 라인이 윈도우의 상단에 위치하도록 윈도우를 스크롤한다.

Ctrl+Shift+C

WindowScrollToCenter

Scrolls the window so the current line is at the center of the window.

현재 라인이 윈도우의 중앙에 오도록 윈도우를 스크롤한다.

Ctrl+Shift+B

WindowScrollToBottom

Scrolls the window so the current line is at the bottom of the window.

현재 라인이 윈도우의 바닥에 위치하도록 윈도우를 스크롤한다.

Ctrl+J

ConditionalUp (built-in)

Moves back to an enclosing #if.

감싸고 있는 #if 이동한다.

Ctrl+K

ConditionalDown (built-in)

Moves forward to an enclosing #else or #endif.

감싸고 있는 #else #endif 이동한다.

Ctrl+Alt+S

WindowSplitHorizontal

Splits a text editor window into two panes (with the split running horizontally).

텍스트 에디터 윈도우를 두개의 영역으로 나눈다. (수평으로 나눔)

Alt+Up arrow

WindowSwitchPaneUp

Moves one pane up in a split window.

나누어진 윈도우의 위쪽 영역으로 이동한다.

Alt+Down arrow

WindowSwitchPaneDown

Moves one pane down in a split window

나누어진 윈도우의 아래쪽 영역으로 이동한다.

Alt+Left arrow

WindowSwitchPaneLeft

Moves one pane left in a split window

나누어진 윈도우의 왼쪽 영역으로 이동한다.

Alt+Right arrow

WindowSwitchPaneRight

Moves one pane right in a split window

나누어진 윈도우의 오른쪽 영역으로 이동한다.

 

You can get the latest updates to this and my other articles at http://home.inreach.com/mdunn/code/

 

글의 최신 업데이트와 필자의 다른 글들을 http://home.inreach.com/mdunn/code/ 에서 있다.

 

About Michael Dunn

 

Michael lives in sunny Los Angeles, California, and is so spoiled by the weather that he will probably never be able to live anywhere else. He started programming with an Apple //e in 4th grade, graduated from UCLA with a math degree in 1995, and immediately landed a job as a QA engineer at Symantec, working on the Norton AntiVirus team. He pretty much taught himself Windows and MFC programming, and in 1999 he designed and coded a new interface for Norton AntiVirus 2000.

Mike now works as a developer at Napster, an online subscription music service. He also developed UltraBar, an IE toolbar plugin that makes web searching easy and trounces the Google toolbar; the CodeProject SearchBar; and has co-founded Zabersoft, a development company with offices in
Los Angeles and Odense, Denmark.

He also enjoys his hobbies of playing pinball, bike riding, and the occasional PlayStation, Dreamcast, or MAME game. He is also sad that he's forgotten the languages he's studied: French, Mandarin Chinese, and Japanese.

Click here to view Michael Dunn's online profile.



============================================================================================================

<Visual C++의 유용한 단축키>

* Ctrl+F3 : 현재 커서가 있는 위치의 단어가 나오는 다음 위치를 찾아줍니다. Ctrl+Shift+F3을 누르면 이전 걸 찾아주죠.

* Ctrl+H : replace입니다. 특히 일정부분안의 변수 이름을 변경하거나 할 때 범위를 선택한 다음에 Ctrl+H를 누르면 편하죠.

* Ctrl+], Ctrl+E : 괄호 짝을 맞춰줍니다. {위에서 누르면 짝이 맞는 }를 찾아주지요.

* Ctrl+L : 한줄을 잘라냅니다. -> 클립보드로

* Ctrl+Shift+L : 한줄을 지웁니다.

* Ctrl+J, K : #ifdef ... #endif 쌍을 찾는데 사용합니다.

* 그외 Ctrl을 누르고 커서나 Delete, Backspace를 누르면 단어 단위로 동작을 하게 됩니다.

* Alt+F8 : 인덴트 정리. 일정 범위를 선택하고 누르면 라인 앞부분의 공백을 자동으로 조정해줍니다.

* CTRL+SHIFT+T : 커서 위치의 단어와 앞 단어가 서로 교체 됩니다.

* ALT+SHIFT+T : 커서 위치의 한줄과 윗줄이 서로 교환됩니다.

* Shift + F9 : 디버그 모드에서 추가하고픈 변수나 등등 앞에 커서를 위치 시킨후 Shift+F9를

누르면 Watch Window에 자동으로 추가.

* Ctrl + Alt + T , Ctrl + Spacebar : 멤버목록 팝업창이 나타납니다 (참고로 대소문에 관계없습니다.)

* Ctrl + Shift + U : 소문자를 대문자로 바꾸고 싶을때 블럭 지정을 한다음 이 키를 누르면 소문자가 대문자로 둔갑.

* Ctrl + U : 대문자를 소문자로 변경

* Ctrl + Shift + 8 : Tab은 ^모양으로 공백문자는 .로 변경, 다시 누르면 설정이 해제

블로그 이미지

요다할아범

,

#pragma 는 #로 시작하는 Precompiler(전처리구문) 지시자중 하나이다.

컴파일러에 종속적인 명령으로, 컴파일러에 직접 정보를 전하기 위해 사용하는데,

컴파일러에 종속적이기 때문에 컴파일러는 변경했을 경우 실행을 보장하진 못한다.

 

#pragma 명령어 중 자주 쓰이는 once 와 comment()에 대해서 알아보자.

 

1. #pragma once

 

#pragma once 는 C의 헤더 파일 최상단에서 자주 볼 수 있는데, 컴파일러에게 해당 헤더 파일이 한번만

빌드되도록 알려주는 명령이다. 즉, 여러번 인클루드 되는 것을 컴파일러 차원에서 막아주게 된다.

 

예를 들어, A.h라는 파일이 여러 곳에서 복잡하게 #include 되어 쓰이게 된다면 그때마다 가각 정의가

추가되게 되어 중첩되는 경우가 생긴다. 이 경우 중복 정의되었다는 에러가 발생하게 된다.

 

즉, 같은 내용이 여러번 빌드되게 되는 것을 막기위해 #pragma once 를 사용하는 것이다.

 

참고:

중복 정의에 대한 에러를 막기 위해 #ifndef 문을 써도 된다.

사용 예) 헤더파일 부분에

#ifndef _A

#define _A

// 헤더파일 내용

#endif

 

2. #pragma comment()

 

#pragma comment()로 사용할 수 있는 명령은 여러 개가 있는데, 그 중 가장 대표적인 것이

#pragma comment(lib, "*.ilb")로 해당 라이브러리를 링크 시켜준다.

 

예를 들어 VC++6.0에서 DirectDraw를 사용하기 위해서는 Project>>Settings의 Link 탭으로 이동하여

Object/library modules 항목란에 ddraw.lib 와 dxguid.lib를 적어 넣어 lib 파일을 링크해 줘야 한다.

 

하지만,

 

#pragma comment(lib, "dxguid.lib")

#pragma comment(lib, "ddraw.lib")

와 같이 소스코드 내에서 명시적으로 지정을 하면, Project>>Settings... 의 과정을 거치지 않고도 라이브러리를

링크할 수 있다.

 

 

3. #pragma warning(disable : 4200)

 

#pragma warning 경고 메시지와 관련된 지시자로서

#pragma warning(disable : 4786)
#pragma warning(disable : 4100)


이렇게 소스 파일에 적어놓으면 이 지시자가 나타난 순간부터 각각 4786, 4100번의 경고 메시지를 출력하지 못하게 합니다. MS 컴파일러에서 각각의 경고 메시지는 자신의 고유번호를 갖고 있습니다. 예를 들어 다음 소스를 경고레벨 4에서 컴파일한다면,


void f(int a)
{
}

int main()
{
 return 0;
}


다음과 같은 메시지를 출력합니다.

e:\Temp Projects\Test2\Test2.cpp(6) : warning C4100: 'a' : 참조되지 않은 형식 매개 변수입니다.


이때 C4100이 바로 경고메시지의 고유번호입니다.

C는 컴파일러에서 발생했다는 뜻이며, 4100이 경고 메시지 번호입니다.


이런 경고 메시지가 많이 발생되는 경우, 컴파일 속도가 심각하게 느려질수 있습니다.

또, 깨끗한 프로그램을 위해 경고레벨4에서 경고메시지 없이 컴파일 되기를 원하는 개발사도 있습니다.  이럴때, 다음처럼 해당 경고를 삭제해 주는 것입니다.


#pragma warning(disable: 4100)


void f(int a)
{
}

int main()
{
 return 0;
}


위의 소스는 실제로는 경고메시지를 끄는 것 보다는 경고메시지의 근본적인 오류를 제거해야 할 것입니다. 무슨말이냐하면, 실제로 f라는 함수에서 a라는 매개변수를 사용하지 않기 때문에, 매개 변수를 없애던가, 함수내부에서 매개변수를 사용하게끔 하던가, 혹은 나중에 사용하기 위해 설계상 써놓은 것이라면, 다음처럼 소스를 수정합니다.


void f(int /* a 차후에 사용될 것임을 명시하는 주석문*/)
{
}


또는


void f(int a)
{

 a; // 차후에 사용될 것임을 명시하는 주석문.
}


하지만, 위 4786번 메시지의 경우 STL과 관련된 VC++6.0의 버그로서, 이 경우에는 어쩔수 없이 삭제해 주어야 합니다.

블로그 이미지

요다할아범

,

Win32 개발환경에서 VC++을 사용하면 디버그 모드에서 TRACE라는 매크로를 사용하여 디버그 결과창에 디버깅중 점검해야 할 내용들을 쉽게 볼 수 있도록 화면에 찍어줄 수 있는데, MFC를 사용하지 않거나 릴리즈 모드에서도 이걸 사용하고 싶을때 활용하는 방법..

우선 www.sysinternals.com 사이트에 가서 DebugView 라는 프로그램을 다운로드 받는다.. 이 프로그램은 디버그 결과창에 나오는 내용을 볼 수 있도록 해주는 어플리케이션인데, 디버그로 빌드가 되었건 릴리즈로 빌드가 되었건 상관없이 디버그 결과창에 찍히는 문자열들을 보여준다.. 릴리즈로 실행시에는 VS의 디버거로 실행되지 않으니 디버그 결과창을 볼 수 없으니 이 프로그램이 필요하다.. 물론, 디버그 모드로 빌드된 어플리케이션도 느리고 덩치큰 디버거와 함껫 실행시키는 것 보다 이 어플리케이션으로 확인해보는게 편한 경우도 많으므로 꽤 유용한 프로그램이다.. 이런 어플리케이션은 열심히 사용을 해줘야 한다..

TRACE 매크로는 디버그로 빌드된 경우만 동작하도록 작성되어 있으므로 TRACE 매크로 소스를 수정해서 사용하는 방법이 하나가 있겠고, TRACE 매크로 소스를 보고 릴리즈에서도 동작하도록 내가 만들서 쓰는 방법이 있다..

이와 같은 욕구는 이미 다른 개발자들도 가지고 있었을 것이고, 인터넷을 뒤져보면 아래와 같은 함수를 찾을 수 있는데, 릴리즈 모드 및 MFC를 사용하지 않는 Win32 API만 사용해야 하는 경우에 사용할 수 있다.. (나 같은 경우는 심심풀이로 Win32 게임을 만들면서 사용을 하려고 찾았었는데, 아직도 게임을 MFC로 만들면 안된다는데는 공감을 못하고 있다.. 흐흐흐.. 그때 찾은 출처를 남겨놨어야 하는데, 암튼 어디서 찾았는지 지금은 모르겠고, 다시 찾기는 좀 귀찮고.. 암튼 확실한건 내가 작성한 소스는 아니다..)

#include "stdio.h"

void Trace(char* szFormat, ...)
{
    char szTempBuf[2048] ;
    va_list vlMarker ;

    va_start(vlMarker,szFormat) ;
    vsprintf(szTempBuf,szFormat,vlMarker) ;
    va_end(vlMarker) ;

    OutputDebugString(szTempBuf) ;
}
이제 준비가 다 되었으니 TRACE를 쓰고 싶은 경우에 위의 함수를 사용하고, 위에서 설명한 어플리케이션을 띄워두면 된다.. 물론, 불필요한 코드가 호출되고 링크되는 것이 영 눈에 거슬린다면 매크로를 사용해서 디버그인 경우만 포함되도록 컨디셔널 컴파일 구성을 하면 되겠다..

보는 바와 같이 C 언어를 알면 해결할 수 있는 함수들로 구성되어 있고 모르는 API는 OutputDebugString 하나 뿐이다.. 의외로 이 API가 디버그 모드에서만 동작하는 것으로 아는 사람들이 많은데, 이름만 보고 섵부른 판단은 금물이다.. 궁금하면 직접 해보면 되는데, 사실 이런 궁금증을 가지는 사람도, 직접 궁금증을 해결하기 위해 행동하는 사람도 비교적 적은 것 같아 아쉽다..

프로그래밍 뿐만 아니라 무슨 일을 하던, 이건 이럴거야 라고 선입견을 가지기 전에 정말로 그런지 약간의 시간을 들여 확인을 해보면 많은 도움이 될 것 같다는 생각이 든다.. 아마, 이 함수는 많은 개발자들이 알고 있거나 이미 사용하고 있겠지만, 역시나 또 많은 개발자들이 이렇게 활용하는 방법이 있을 거라는 것 조차 모르고 넘어가고 있는 것 같아 (릴리즈에서는 디버그 문자열을 확인할 방법이 없네.. 걍 디버그로 하자.. 이런 자세.. 음, 좋지 않다..) 기록을 남겨본다..

물론, 나 역시 여러 상황에서 위와 같은 태도를 보이는 경우가 많긴 하지만 스스로 그러한 것들을 깨려고 노력할때 명랑 코딩 사회 건설에 도움이 되지 않을까 싶다.. 우선 명랑 코딩 사회 건설을 위해 프로그래밍은 3D라는 이야기 부터 우리 입에서 없애도록 하자.. 그러기 위해 오늘도 열심히 실력 연마를 위해 힘 내자구~
 
 
 
===================================================
실제 적용 - 1
===================================================
Visual C++에서 API 등 MFC가 아닌 프로그램을 작성할 때 TRACE 매크로 처럼

Output 창에 값을 출력하려면 다음과 같은 매크로를 작성하여 사용하면 된다.

파일에 기록하는 것도 유사하게 작성하면 되겠다.


**


#include <windows.h>

#include <stdio.h>


#ifdef _DEBUG

#define TRACEf                Tracef

#else

#define TRACEf                ((void)0)

#endif


#ifdef _DEBUG

#define MAX_MSG_SIZE          1024           // 1K 넘는건 보내지마! -_-x


void TRACEf(const char *szString, ...)

{

        static char szBuffer[MAX_MSG_SIZE];

        va_list argptr = NULL;


        va_start(argptr, szString);

        vsprintf(szBuffer, szString, argptr);


        OutputDebugString(szBuffer);


        va_end(argptr);

}

#endif


 

**


사용은 TRACE 매크로처럼 원하는 곳에서


**


TRACEf("s = %lf | t = %lf | u = %lf\n", s, t, u);


**


이렇게 하면된다. 당연히 릴리즈 모드일 때는 제외된다.


...


===================================================
실제 적용 - 2 : 파일로 작성
===================================================
void Global_WriteLog(const char* msg ...)
{
 SYSTEMTIME st;
 GetLocalTime(&st);

 char szCurTime[100] = {0, };
 _stprintf(szCurTime, "[%04d/%02d/%02d %02d:%02d:%02d.%04d]   ",
    st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

 TCHAR szLogPath[MAX_PATH] = {0, };
 wsprintf(szLogPath, "%s\\PTCAgent.log", g_szClientLogPath);
 g_fpLog = fopen(szLogPath, "a+");
 fprintf(g_fpLog, szCurTime);

 va_list ap;
 va_start(ap, msg);
 vfprintf(g_fpLog, msg, ap);
 fclose(g_fpLog);
}

블로그 이미지

요다할아범

,
일단 namespace는 중대형 프로젝트에서 타사 라이브러리를 자주 가져다 쓰는 경우 곧잘 발생하는 이름 충돌 문제를 해결하기 위해 도입됐습니다. 도입되기 전까지만해도 쓰자파와 쓰지말자파간에 입씨름이 대단했었으나, 결국 표준 라이브러리에 이름공간이 적용됨으로써 일단락 됐죠. 이후 개발되는 모든 언어에는 아예 이름 공간을 안쓰면 프로그램이 안되는 것들도 있습니다. 왜 그럴까요? 정말 윗분들 처럼 쓸데 없는것이라면.. 그냥 없애버리는게 나을텐데..?

namespace가 쓸데없다라고 말하는 사람들의 대부분은 대형 프로젝트를 경험해보지 못한 사람입니다. 대형 프로젝트를 경험했더라도, namespace 분할을 적절하게 하지 않았기 때문에 거추장스럽게만 느껴지는 경우겠죠.

-----------------

현대의 프로그램 세계는 모든것을 자체 개발하기엔 너무 덩치가 커졌습니다. 따라서 몇몇 라이브러리들은 구입해 사용하게 되는 경우가 많이 있는데요. namespace가 없는 A사와 B사의 라이브러리에 Tree라는 이름이 다음과 같이 나와있다고 해봅시다.

A사의 라이브러리중에
struct Tree {};

B사의 라이브러리중에
int Tree;

두개의 라이브러리는 호환되지 않는 이름의 충돌로 인해 컴파일이 안됩니다. 쉽게 말하자면, A사의 라이브러리와 B사의 라이브러리는 절대! 같이 쓸수 없는 라이브러리가 되는 것입니다.

이전에는 대개 라이브러리 함수 이름 앞에 특정한 패턴을 붙여서 이런 문제를 해결했죠 예를들어 acorpTree (A사의 Tree라는 뜻) 뭐 이런식으로요.. 그렇지만, 이런 경우 거의 대부분 읽기 어렵고 지저분한 소스를 만들어 내게 됩니다. 정리가 안되죠.

만약 A사와 B사가 namespace를 잘 정의해서 라이브러리를 구현했다면, 이런 문제를 깨끗하게 해결해 줍니다.

------------------

그럼 어떻게 namespace를 구현하느냐..
구현은 간단합니다. namespace로 정의할 것들을 블럭으로 묶으면 됩니다.

namespace A
{
struct Tree {};
}

namespace B
{ int Tree; }

-------------------

사용하는 측에서는 다음중 하나를 선택해 쓰면 됩니다.

1. using namespace A;
(의미 : 현재 소스 코드에 A사 라이브러리만 쓰이는경우, 이름충돌이 예상되지 않으므로, A에 있는 모든 이름들을 현재 소스의 범위내에 가져온다)

2. using A::Tree;
(의미 : 현재 소?코드에 A사와 B사의 라이브러리가 동시에 쓰이는데, 현재 블럭에서 사용할 Tree는 A사의 Tree 구조체이다)

3. B::Tree = 10;
(의미 : 현재 소스 코드에 A사와 B사의 라이브러리가 동시에 쓰이는데, 현재 블럭에서 두 회사의 라이브러리가 모두 섞여 쓰이므로 명시적으로 이름을 정해준다)

--------------------

이외에도, 이름공간에는 몇가지 까다로운 주의사항 및 고급 사용기법들이 있지만, 현 레벨에서는 이 정도로 충분하다고 봅니다.

윗분들의 답변을 보고.. 한심하다는 생각이 들어서 잔소리 좀 하고 가겠습니다. 우선 남들이 안쓰니깐 쓰지말라는건 말이 되지 않습니다. 전 오히려 namespace를 (적절히 잘) 쓰는 소스코드를 더 많이 봐왔는데요????

또, 어려운 소스를 쓰는 사람은 무조건 잘난척 하는 사람입니까? 천만에요. 그 소스를 만든 사람이 정말 잘난척을 하고 싶었는지의 여부는 물어보면 압니다. 잘난척 하기 위해 소스를 어렵게 만든 사람들은 그 용도를 정확히 알지 못합니다. 꼭 써야할 곳에 써야 하는데, 그러질 못하죠.

그런 잘난척(?) 하기위해 무조건 가져다 쓰는것도 문제가 됩니다. 불필요한 코딩 오버헤드가 발생하는데다, 오작동 할 우려가 크기 때문에요..

----------------------------

namespace가 어떻게 쓰일때 어떤 장/단점을 가지는지 명확히 판단하시고 쓰세요. 비단 namespace 뿐만 아니라, 다른 어떤 기술들도 마찬가지입니다.

** 우선 코어 엔진이나 라이브러리 개발자라면 namespace를 사용해 프로그래밍 하는 습관을 들이십시요. 물론 우리나라엔 게임 엔진을 파는 경우가 거의 없으니 해당사항은 없겠지만요.

** 반대로 그런 경우가 아니라고 하더라도, namespace의 사용법은 정확히 알고 있어야 합니다. 우리보다 뛰어난 프로그래머가 만들어 공개한 좋은 소스를 namespace를 몰라서 못쓴다면 좀 억울할테니까요..

잘쓰면 약이되고 잘못쓰면 독이 된다는 말씀 아시죠? namespace도 마찬가지입니다. 어떨때 왜 써야 하는지, 어떨때 왜 쓰지 말아야 하는지, 자꾸 생각하는 프로그래머가 되어야 합니다.

한 몇년 그만그만한 프로그래머로 지내다 결국 포기하는 사람들을 수도 없이 보아 왔습니다. 반대로, 정말 뛰어난 분들도 수없이 보아왔구요.. 그둘의 차이는, 편견없이, 솔직하게, 지적인 호기심을 가지고 사는 사람이냐 아니냐의 차이입니다. 부디 분발하셔서 좋은 프로그래머가 되시길 바랄께요.. 그럼.. 
블로그 이미지

요다할아범

,

HowTo: Visual C++ 성능 문제 해결 방법

본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++, 32-bit Editions 5.0, 6.0
중요: 본 문서는 레지스트리 편집에 대한 정보를 수록하고 있습니다. 레지스트리를 편집하기 전에 문제가 발생할 경우를 대비해 레지스트리를 복원하는 방법을 알고 있어야 합니다. 레지스트리를 편집하는 방법에 대한 내용은 Regedit.exe의 "레지스트리 복원" 도움말 항목이나 Regedt32.exe의 "레지스트리 키 복원" 도움말 항목을 참고하십시오.

요약

본 문서는 다양한 상황에서 Visual C++ 성능을 향상할 수 있는 단계들을 문서화합니다. 다음의 모든 상황은 Visual C++ 6.0 과 일부는 Visual C++ 5.0 에도 적용됩니다.

추가 정보

경고: 레지스트리 편집기를 잘못 사용하면 심각한 문제가 발생할 수 있으며 문제를 해결하기 위해 운영 체제를 다시 설치해야 할 수도 있습니다. Microsoft는 레지스트리 편집기를 잘못 사용하여 발생하는 문제에 대해 그 해결을 보증하지 않습니다. 레지스트리 편집기의 사용에 따른 모든 책임은 사용자에게 있습니다.

레지스트리 편집 방법에 대한 자세한 내용은 레지스트리 편집기(Regedit.exe)의 "키 및 값 변경" 도움말 항목 또는 Regedt32.exe의 "레지스트리의 정보 추가 및 삭제" 및 "레지스트리 데이터 편집" 도움말 항목을 참조하십시오. 레지스트리를 편집하기 전에 레지스트리 파일을 백업해야 합니다. 또한 Windows NT나 Windows 2000을 실행하는 경우 ERD(응급 복구 디스크)를 업데이트해야 합니다.

Visual C++ 성능향상을 위한 제안

  • 모든 workspace 는 관련 .ncb and .opt 확장자를 가진 파일들을 가지고 있습니다. 이들 파일들은 충돌할 수 있습니다. 이 파일들을 만들기 위해서는 처음에 workspace를 닫아야 합니다. 그리고 나서 위의 두 파일을 삭제하거나 이름을 변경하기 위해서 workspace 디렉터리로 갑니다. Workspace를 다시 열면 이 파일들은 다시 만들어 질 것입니다. 여러분은 그 파일들이 만들어 질 때 지연 현상을 겪게 될 것입니다.

    주의: .ncb 파일은 ClassView, IntelliSense 그리고 WizardBar에 대한 정보를 가지고 있습니다. .opt 파일은 workspace 설정 파일입니다. .opt 파일을 지우는 것은 당시 Window Position, Breakpoints, 기타 Minor Settings의 손실을 초래할 것입니다.

    자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
      Q173164 PRB: Loading a Workspace Is Slow in Visual C++
  • Visual C++ 6 에만 해당: IntelliSence 은 Visual C++ 를 느려지게 할 수 있습니다. 이것을 점검하고 해결하기 위해서는 도구 메뉴에서 옵션을 선택함으로써 IntelliSense을 사용 불가능하게 만드는 것입니다. 편집 탭에서 "Statement completion options" 그룹에 있는 모든 체크 박스를 해제합니다. 더 자세한 정보는 Microsoft 기술 자료에 있는 다음의 문서를 참조하십시오.
      Q153284 INFO: Limitations of IntelliSense in Visual C++ 6.0
  • Visual C++ integrated development environment (IDE)와 통합된 Microsoft Visual SourceSafe와 같은 소스 코드 제어 소프트웨어는 Visual C++ 가 시작하는 동안에 source code server에 연결하도록 설정될 수 있습니다. 그러한 경우에 네트워크 연결의 손실은 Visual C++ 이 매우 느리게 시작하는 원인이 될 수 있습니다. 성능을 향상 시키려면 적절한 네트워크 연결 또는 Visual C++ IDE에서 소스 코드 제어 소프트웨어 통합을 사용 불가능하도록 하는 것입니다. 후자를 선택하시려면 Visual C++을 종료하고 나서 다음의 레지스트리 키를 입력하기 위해서 RegEdit.Exe을 사용하고 Disabled 값을 (DWORD) 0x00000001 로 설정하는 것입니다: HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Source Control\Disabled주의: 레지스트리 키들을 수정하기 이전에 Visual C++를 종료하였는지 확인하시기 바랍니다. 그렇지 않으면 변경된 값은 적용되지 않을 것입니다.
  • 소스 코드 제어 소프트웨어는 소스 코드 제어 하에서 Visual C++ 프로젝트들에 대한 Background Status 업데이트들을 수행할 수 있습니다. 이러한 특성이 사용 가능하다면 이들 업데이트들은 IDE에서 응답을 느려지도록 할 수 있습니다. 이들 background update들을 사용하지 못하도록 하려면 도구 메뉴에서 옵션을 선택합니다. 그리고 나서 Source Control 탭을 클릭하고 Perform Background Status Updates 체크박스를 해제합니다. 더 자세한 정보는 Microsoft 기술 자료에 있는 다음의 문서를 참조하십시오.
      Q195375 FIX: ClassView Can Be Very Slow When SourceSafe Is Being Used
  • 64개의 네트워크 디렉터리보다 적은 곳으로 여러분의 파일을 옮기시기 바랍니다. 이것은 Visual C++가 사용하는 방법이므로 64번째와 위의 디렉터리들을 매 5분마다 검색하는 file change notifications를 얻는데 도움을 줍니다.

    더 자세한 정보는 Microsoft 기술 자료에 있는 다음의 문서를 참조하십시오.
      Q216098 PRB: Visual C++ IDE Slows When Files Are in Many Directories
  • Source editor 와 Resource editor 를 사용할 때 WizardBar는 성능문제를 일으킬 수 있습니다. WizardBar를 사용 불가능하게 하는 것과 Visual C++를 재시작 하는 것은 성능을 향상시킬 수 있습니다. 더 자세한 정보는 Microsoft 기술 자료에 있는 다음의 문서를 참조하십시오.
      Q202591 BUG: Developer Studio Source and Dialog Editors Respond Slowly
      Q170511 PRB: WizardBar Notification Slows Down Dialog Editor
  • 많은 수의 자원을 resource-only DLL 으로 나누는 것은 IDE 의 성능을 향상시킬 수 있습니다. 여러분은 AppWizard에 의해서 만들어진 MFC 응용 프로그램에 약 100여 개의 다이얼로그를 추가함으로써 이것을 확인하실 수 있습니다. ClassWizard를 사용하여 그 다이얼로그들 내에 있는 어떠한 컨트롤이라도 코드와 associate 하는 것은 그 다이얼로그에 대한 성능 문제을 초래할 것입니다.

    프로젝트를 시작하기 이전에 Resource-only DLL 내부에서 번역된 리소스(localized resources)를 보관하도록 여러분의 프로젝트를 설계하는 것을 고려하여야 합니다. 자세한 정보를 보시려면 MSDN Online Libraries(http://msdn.microsoft.com/resources/libraries.asp) 내에 있는 다음의 MFC 기술 노트를 참고하십시오. 자원을 그룹화하는 것과 그들을 하나의 파일에 두는 것 보다 각각 리소스 파일들(.rc)에 위치시키는 것을 고려해야 할 수도 있습니다. 보다 자세한 정보를 보시려면 MSDN Online Libraries 내에 있는 다음의 MFC 기술 노트를 참고하시기 바랍니다
  • Visual C++ 6 에만 해당: 디버그 세션 동안에 소스 코드 편집은 느릴 수도 있습니다. 편집을 불가능하게 하고 Continue 옵션은 성능을 향상시킬 수도 있습니다. 그렇게 하기 위해서는 도구 메뉴에서 Options 을 선택합니다. Debug 탭에서 Debug Commands Invoke EditContinue 체크 박스를 선택하지 않습니다. Edit and Continue 컴파일러 스위치 /ZI 를 사용하는 것을 피해야 하는 것 대신에 /Zi 를 사용할 수도 있습니다.
  • IDE내에서 실행되는 모든 add-ins 과 매크로에 대해서 잘 알고 있어야 합니다. 왜냐하면 process-intensive, 잘못 설계된 매크로, add-ins 는 Visual C++를 느려지게 하기 때문입니다. 이러한 것을 점검하기 위해서는 도구 메뉴에서 Customize를 선택합니다. 로드 된 add-ins 과 매크로는 모두 Add-ins and Macro Files 탭에 나열되어 있습니다. 이들이 성능을 떨어뜨리는지 테스트하기 위해서는 모든 add-ins 와 매크로에 대해서 체크 박스를 선택하지 않습니다. 이들 add-ins 과 매크로가 로드 되지 않았는지 확인하기 위해서 Visual C++를 종료하였다가 다시 구동 시킵니다.
  • 마이크로소프트 운영 체제가 아닌 다른 운영 체제에서 remote 상에 파일들이 위치하게 되는지 확인하시기 바랍니다. 여러분의 네트워크 클라이언트 소프트웨어가 적절하게 설정되어 있는지 확인하시기 바랍니다. 증가한 네트워크 트래픽은 성능에 영향을 줄 수도 있습니다.
  • Project 종속 관계 또한 빌드하는데 소요되는 시간을 증가시킬 수도 있습니다. 더 자세한 정보는 Microsoft 기술 자료에 있는 다음의 문서를 참조하십시오.
      Q229030 BUG: A Workspace with Many Dependencies May Appear to Hang
    프로젝트 파일들을 생성하는 Exporting 은 이러한 경우에 느려질 수 있습니다.
  • 파일에 대한 긴 경로는 성능을 저하 시킬 수도 있습니다, Visual C++ 가 Include 파일들의 위치를 검색해야 하는 경로가 많을수록 compilation은 오래 걸릴 것입니다. 네트워크 경로를 사용하는 것 역시 성능문제의 원인이 될 수 있습니다. 프로젝트에서 지정한 검색 경로를 찾는 것은 다음의 단계들을 따르시기 바랍니다.

    1. 프로젝트 메뉴에서 설정을 클릭하시기 바랍니다.
    2. 설정 대화 상자에서 C/C++ 탭을 선택하시기 바랍니다.
    3. Category 의 드롭다운 목록에서 Preprocessor 를 선택하시기 바랍니다.
    4. Project-specific include paths는 부가적인 include 디렉터리 편집 상자 내에 존재합니다.
    전체적으로 Visual C++ 에 적용되는 검색 경로를 찾기 위해서는 다음의 단계들을 따르시기 바랍니다.
    1. 도구 메뉴상에서 옵션을 클릭합니다.
    2. 옵션 대화 상자에서 디렉터리 탭을 선택하시기 바랍니다.
    3. Show directories for list 에서 Include files 를 선택합니다.
  • 시스템 가상 메모리와 하드 디스크가 부족할 수도 있습니다. 필요하다면 RAM을 추가하거나 대용량의 하드 디스크를 추가함으로써 성능을 개선할 수도 있습니다.

    Windows NT 가 실행 중인 컴퓨터들의 메모리 사용을 모니터하기 위해서는 작업 관리자를 사용하시기 바랍니다. Windows 95 또는 Windows 98 이 실행 중인 컴퓨터들 상에서는 Resource Meter를 사용할 수도 있습니다. Resource Meter를 설치하기 위해서는 제어판에 있는 프로그램 추가/ 삭제에서 Windows 설정 탭을 선택하고 시스템 도구를 두 번 누릅니다. Resource Meter 는 도구들 중에 나열되어 있습니다. 체크 박스에 표시를 하고 Resource Meter를 설치하기 위해서 확인을 누릅니다. Visual C++ 에서 제공되는 Process Viewer (PView.exe)도 사용할 수 있습니다.
  • 다른 프로그램 또는 서비스들은 귀중한 CPU 시간과 메모리를 활용하고 있을 수도 있습니다. 그런 경우 일시적으로 시스템 시작 폴더에서 제거하고 해당 컴퓨터를 재시작 할 수도 있습니다. Windows NT가 실행중인 시스템에서는 하나 이상의 시작 그룹이 존재할 수도 있습니다. 그런 모든 시작 그룹을 비우시기 바랍니다. CPU와 메모리의 활용을 모니터 하기 위해서 이전 단계에서 언급한 도구를 사용할 수도 있습니다.

    사용자 정의(Customizing)와 시작 그룹(Startup group) 비활성화에 대한 더 자세한 정보는 Microsoft 기술 자료에 있는 다음의 문서를 참조하십시오.
      Q152122 How to Customize the Start or Programs Menu
      Q81606 Disabling the Startup Group in Windows
  • Background에서 실행 중인 Antivirus 프로그램은 여러분이 작업하는 파일을 스캐닝 할 수 있습니다. 바이러스 스캐너를 일시적을 사용하지 못하도록 하면 Visual C++ 성능을 향상시켜 줍니다. 그러므로 보다 적게 검색하도록 바이러스 스캐너를 설정하거나 최근의 업데이트에 관해서 소프트웨어 제조 업체로 문의하시기 바랍니다.
  • 불량 드라이버는 성능문제의 원인이 될 수도 있으며 잠재적으로는 repainting delays 의 원인이 될 수도 있습니다. 성능문제의 원인이 될 가능성이 있는 디스플레이 드라이버를 제거하시기 바랍니다. Windows NT 가 실행 중인 컴퓨터들 상에서 Windows NT VGA 모드에서 해당 문제를 재현해보시기 바랍니다. Windows 95 또는 Windows 98 이 실행 중인 컴퓨터들 상에서 디스플레이 어뎁터를 제어판내의 디스플레이 어플리케이션을 사용하여 표준 VGA 로 바꾸시기 바랍니다. 이들 모드에서 서드 파티 디스플레이 드라이버들은 사용 불가능하게 됩니다.

    드라이버에 오류가 있는 경우 업데이트 된 버전을 구해보시기 바랍니다. 일시적인 대처 방안은 디스플레이 설정을 바꾸는 방법도 있습니다. 제어판으로부터 디스플레이 프로그램을 시작하고 설정 탭을 선택합니다. 데스크 톱 해상도, 화면 주사율, 시스템에서 사용되는 색상의 수를 변경하시기 바랍니다.
블로그 이미지

요다할아범

,