/*주요 IMPORT OPTION*/
키워드 기본값 의미
-------------------------------------------------------------------------------
USERID 없슴 오라클사용자이름과 암호
BUFFER O/S지정 데이터행이통과 할 버퍼의크기
COMMIT N Y값은 각 배열이 삽입된 후 커밋되도록 지정
롤백세그먼트가 과도하게 많아지는 것을 막으려면 Y로
FEEDBACK 0 n행이 임포트될때 점(.)이출력되도록 정수 n지정
FILE expdat.dmp 입력화일이름
FROMUSER NULL 임포트되는 오브젝트의 소유자리스트
FULL N Y는 전체데이타베이스 임포트
GRANTS Y 임포트되는 오브젝트에대한 모든부여
HELP N Y는 파라미터와 그 의미를 출력
IGNORE N Y로설정하면 오브젝트생성시 발생하는에러무시
INDEXES Y 인덱스 임포트
INDEXFILE NULL 파일이 인덱스 생성명령을 받는 파일을 지정
LOG NULL 모든 임포트 메세지를 저장할 파일 이름
PARFILE 임포트파라미터의 리스트를 가지고있는 파일이름지정
RECORDLENGTh O/S지정 입력레코드의 크기,데이타가 다른 레코드크기를 가진
운영체제로익스포트된경우
ROWS Y 데이타임포트
SHOW N 익스포트 화일의내용 출력되고 임포트 안됨
Y지정시 fromuser,touser,full,tables
TABLES NULL 임포트될 테이블이름
TOUSER NULL 테이블을 임포트할 사용자 이름의리스트
IMP_FULL_DATABASE롤을 가진 사용자만이 이 파라미터를
사용하여 오브젝트를 다른 사용자의 계정으로 임포트
-------------------------------------------------------------------------------
(FULL=Y,OWNER=user,또는 TABLE=schema.table파라미터는 같이사용될 수 없습니다.)



/*주요 EXPORT OPTION*/
키워드 기본값 의미
-------------------------------------------------------------------------------
USERID 정의되지 않음 export 를 작동시키는 계정의 username/password.
BUFERR 시스템에 따라 다름 데이터 행을 이동시키기 위해 필요한 buffer size
COMPRESS Y export가 분리되어 EXTENT들을 단일 EXTENT로
압축할 것인지의 여부를 지정.
CONSISTENT N export된 대상 전체에 대한 리드(READ)
컨시스턴트버전을 유지할 것인지의 여부
CONSTRANINTS Y table의 제약사항을 export할 것인지의여부
DIRECT N Y값은 익스포트할때direct path가 사용되도록 지정
FEEDBACK 0 n행이 익스포트될때 점(.)이출력되도록 정수 n지정
FILE expdat.dmp export 덤프파일의 이름
FULL N 전체 DATABASE의 export 여부
GRANTS Y OBJECT에 대한 권한을 export할 것인지의
여부를 결정하기 위한 표시
HELP N Y는 파라미터와 그 의미를 출력
INDEXES Y INDEX를 export 할 것인지의 여부
LOG 정의되지 않음 export log가 기록될 파일의 이름
OWNER 현재사용자 export할 database계정의 목록
PARFILE 정의되지 않음 export에 사용될 파라미터파일의 이름
RECORDLENGTH 시스템에 따라 다름 export 할 record의 길이(byte)
ROWS Y row를 export할 것인지의 여부
STATISTICS estimate 임포트시 사용할 분석방법
TABLES 정의되지 않음 export할 table의 목록
INCTYPE COMPLETE 수행되는 export의 형태 (COMPLETE,CUMUNLATIVE,INCREMENTAL)
ANALYZE ESTIMATE OBJECT 통계자료를 export덤프 파일에 쓸
것인지를 결정
RECORD Y 인크리멘탈 export의 경우에 export를 기록하는
데이터딕션얼리 테이블에 레토르를 저장할
것인지의 여부를 지정하는 표시.
-------------------------------------------------------------------------------
(FULL=Y,OWNER=user,또는 TABLE=schema.table파라미터는 같이사용될 수 없습니다.
Direct path가 지정되면(Direct=Y)Consistent파라미터는 Y로 설정될 수 없습니다.)

예 : exp scott/tiger file=expdat.dmp compress=y tables=emp,dept



====================================
SCOTT의 데이타를 LARRY로 옮기는 방법
====================================
scott의 데이타를 larry 로 옮기려면 export/import 를 이용해야 한다.
larry가 만들어져 있지 않다면 다음과 같이 만든다.

$sqlplus system/manager

SQL>create user larry
identified by lion
default tablespace users
temporary tablespace temp
quota unlimited on users;

default tablespace, temporary tablespace 는 시스템에 따라 알맞게 설정한다.

다음에 권한을 부여한다.

sql>grant connect,resource to larry
sql>revoke unlimited tablespace from larry

물론 users 테이블스페이스는 이미 존재한다고 가정한다.

scott로 익스포트를 받고 larry로 임포트 한다.

$exp scott/tiger owner=scott file=scott.dmp
$imp larry/lion fromuser=scott touser=larry file=scott.dmp

만약 scott 가 dba 권한을 갖고 있었다면 다음과 같이 임포트를 해야 한다.

$imp system/manager fromuser=scott touser=larry file=scott.dmp

만약 임포트 도중 데이타 영역이 부족해서 에러가 발생한 다면 익스포트를 받을
때 compress=n 옵션을 사용하며, 임포트시 롤백 세그먼트 문제가 발생한다면
임포트시 commit=y 옵션을 사용하면 쉽게 해결이 가능하다.

블로그 이미지

요다할아범

,
sqlplus USERID/PASSWORD @FILENAME

이런 명령으로 실행이 가능합니다.

insert into TABLE (COLUMN1, COLUMN2)
values ('A1', 'B1');
commit;

insert into TABLE (COLUMN1, COLUMN2)
values ('A2', 'B2');
commit;

insert into TABLE (COLUMN1, COLUMN2)
values ('A3', 'B3');
commit;

이런 내용을 batch.sql 이란 파일로 만들었다면

sqlplus scott/tiger @batch.sql
블로그 이미지

요다할아범

,
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);
}

블로그 이미지

요다할아범

,