컴퓨터공부/C & C++ & STL 71

Cfaq 14

Q 11.A 자주 쓰이지는 않다고 알고 있는데, volatile이 정확히 어떤 의미를 가지 는 것인가요? Answer volatile 타입 qualifier는 주어진 오브젝트가 컴파일러가 의도하지 않은 방식으로 변경될 수 있다는 것을 나타냅니다. 따라서, 컴파일러는 이 오브젝 트를 최적화(optimization) 과정에서 제외시킵니다. 좀더 정확히 말해서, 이 오브젝트에 대한 참조(reference)나 변경(modification)은 sequence point 를 넘어다니며 최적화되지 않습니다. 단, sequence point 안에서 최적화될 수 있습니다. (sequence point에 관한 것은 질문 3.8을 참고하기 바랍니다.) 일반적으로, volatile이 쓰이는 곳은 크게 두 가지로 나누어 생각할..

&array[0]와 array 의 차이점은 무엇인가요?

배열형 자료구조를 구현할 경우 사용해야합니다. 예를들어 배열의 경우 배열명 자체로 배열의 첫 포인터를 얻을 수 있지만 클래스로 구현된 배열의 경우 오퍼레이터 []를 구현하기 때문에 배열처럼 사용해도 배열과 다른 메모리 위치를 갖습니다. 결국 습관적으로 안전한 코드가 되려면 &array[0] 이러한 형태가 더 좋습니다. 설명이 애매하다면 아래 글을 참고해보세요. http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=480 아치븐 님이 쓰신 글 : : 제목 그대로 입니다. : : 인자를 주소값으로 넘겨줄 때, : : &array[0]와 array 의 차이점은 무엇인가요? : : 제가 알기로는 &와 [] 가 같이 들어가면 상쇄되..

Cfaq 13

Q 11.17 ANSI “stringizing” 전처리기 연산자인 #를 써서 심볼릭 상수의 값을 문자 열에 집어 넣으려고 합니다, 그런데, 그 결과, 상수의 값이 들어가는 대신, 상수의 이름이 들어가는군요. Answer #의 정의에 따르면, 이 것은 매크로 인자를 (인자가 또 다른 매크로 이름 이더라도 더 이상 확장하지 않고) 바로 문자열로 만듭니다. 매크로가 원래 지닌 뜻으로 확장되길 원한다면 다음과 갈이 두 단계를 거쳐서 쓸 수 있습 니다: #define Str(x) #x #define Xstr(x) Str(x) #define OP plus char *opname = Xstr(OP); 이 코드는 opname을 “OP”로 설정하지 않고, “plus”로 설정합니다. (즉, Xstr() 매크로가 인자를 확..

Cfaq 12

그렇다.. "void main()"은 틀린 표현이다. "int main"이 표준이다. + Q 11.12a main()의 정확한 선언 방법을 알고 싶습니다. Answer main()의 선언은 다음 중에서 골라 써야 합니다: int main(void); int main(int argc, char *argv[]); argv를, char **argv로 선언할 수도 있습니다. (질문 6.4를 참고하기 바 랍니다.) (물론 이때 ‘argv’와 ‘argc’라는 이름은 얼마든지 바꿀 수 있습니 다.) 또 오래된 스타일을 써서 다음과 같이 할 수도 있습니다: int main() int main(argc, argv) int argc; char **argv; 질문 11.12b부터 11.15까지 참고하기 바랍니다. Q 11...

Cfaq 11

Q 11.11 다음과 같은 선언에서: typedef char *charp; const charp p; 왜 p가 가리키는 char가 const가 되지 않고, p 자체가 const가 되는 것 일까요? Answer Typedef로 치환한 것은 순수하게 textual 치환이 아닙니다. (이 것은 typedef를 쓰는 한가지 장점이기도 합니다; 질문 1.13 참고) 다음과 같은 선언 에서: const charp p; const int i가 i를 const로 만드는 것과 같은 원리에서, p는 const가 됩니다. p에 대한 선언은, 포인터가 관련이 되어있는지 typedef 안까지 쫓 아가서 확인하지 않습니다. Note 아래와 같은 선언이 있다고 가정하고 (질문 11.9 참고): int * const const_po..

Cfaq 10

Q 10.27 __FILE__과 __LINE__ 매크로를, 디버그용으로, 메시지 출력하는 매크로에 쓰고 싶습니다. 어떻게 하면 될까요? Answer 질문 10.26을 간단히 하기 위해, 따로 만든 질문입니다. 한가지 방법은, 가 변 인자를 받는 함수를 만들고 (질문 15.4, 15.5 참고), __FILE__과 __LINE__ 을 받아서 그 함수에 전달해 주는 함수를 따로 만듭니다. 예를 들면: #include #include void debug(char *fmt, ...); void dbginfo(int, char *); #define DEBUG dbginfo(__LINE__, __FILE__), debug static char *dbgfile; static int dbgline; void dbginf..

C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak )

간단히 메모리 릭 발생여부를 알아내고 이를 해결하는 방법에 대해서 알아봅시다. 이는 MS 사에서 CRT(C Runtime) 라이브러리로 제공해는 CRTDBG 를 이용할 겁니다. 생각보다 쉬운 반면 그 기능은 막강하지요. 일단 프로그램 정의부에 다음과 같이 추가합니다. #include #define CRTDBG_MAP_ALLOC #ifdef _DEBUG #define new new( _NORMAL_BLOCK, __FILE__, __LINE__ ) //궁금하시면 제 게시글 중 편을 보세요. #endif 이제 메인 진입 부 처음에 다음과 같이 선언합니다. 일반 main() 이라고 가정합니다. 물론 WinMain() 일 수도 있습니다. void main() { _CrtSetDbgFlag( _CRTDBG_ALLO..

## preprocessor, string 합치기

## preprocessor은 문자를 합치는 기능이있다. ANSI 이전의 compiler에서는 아래 것을 이용하면 된다. #define XPaste(s) s #define Paste2(a, b) XPaste(a)b + #include #include #define Paste(a, b) a##b #define AB "ab" #define XPaste(s) s #define Paste2(a, b) XPaste(a)b #define A "aaa" #define B "bbb" int main() { printf("%s\n", Paste(A, B) ); // Paste에 보이는 그대로를 붙인다. printf("%s\n", Paste2(A, B) ); // define 되어 있는 것을 붙인다. return 0; }

#error

#error은 위에 있는 #if 조건이 맞지 않을경우 컴파일 에러를 발생 시킨다. VALUE 초기화 실수를 방지할 수 있다. + #include #include #define VALUE 99 #if !(VALUE % 5 == 0 && VALUE > 0) #error VALUE must be a multiple of 5 and more than 0 // VALUE가 "#if !(VALUE % 5 == 0 && VALUE > 0)" 조건에 맞지 않으면 error 발생 // => fatal error C1189: #error : VALUE must be a multiple of 5 and more than 0 #endif #endif int main() { return 0; } 출처 : http://74.12..

assert.h header, assert() 로 설명을 달자

assert 함수는 아래와 같이 사용하는 거다!! assert와 함께 설명까지!!! 이건 assert() 함수를 까보지 않고서는 하지 못하는 스킬이다. god damm!!!! 너무 멋지잖아!! assert( 0 != NULL && "포인터 메모리 할당을 실패했잖아" ); + 다음은 C99의 assert.h이다. 코드가 예술이다.. + #include #include // The following is an implementation of the Standard C99 version of : /* assert.h header */ #undef assert #ifdef NDEBUG #define assert(_Ignore) ((void)0) // DEBUG를 사용하지 않으면 assert가 실행하지 않게 함 ..