macro 3

debug에 사용할 메시지

printf("\n Debug line %d, in the function %s, in the file %s.\n", __LINE__, __func__, __FILE__); + C99 에 새로 추가된 __func__ : 현재 function을 적어 줍니다. __FILE__과 __LINE__ 등은 어디 에나 정의되어 있지 않습니다. __FILE__은 몰라도 __LINE__을 # define으로 정의하는 등있는 이유가없습니다. 이 같은 정의하지 않고도 마음대로 선언되는 매크로 것을 통합 매크로라고합니다. ANSI C는 6 종류의 내장 매크로를 규정하고있습니다. 매크로 이름 어떻게 전개되는지 __FILE__ __FILE__ 파일 이름 리터럴 문자열. __LINE__ __LINE__ 줄 번호를 나타내는 10 진..

Cfaq 9

Q 11.18 메시지 “warning: macro replacement within a string literal”은 무슨 뜻 이죠? Answer : ANSI 이전의 어떤 컴파일러/전처리기는 매크로 정의를 다음과 같이 정 의할 경우: #define TRACE(var, fmt) printf("TRACE: var = fmt\n", var) 다음과 같은 식으로 호출하게 되면: CHAPTER 11. ANSI/ISO STANDARD C 193 TRACE(i, %d); 다음과 같이 확장하게 됩니다: printf("TRACE: i = %d\n", i); 즉, 매크로 인자로 나온 이름이 문자열 안에 있는 경우라도 확장시켜 버립 니다. (물론 이러한 버그가 위와 같이 유용하게 쓰일 수도 있지만, 이 것은 대개 초창기 컴..

cfaq 8

Q 10.4 여러 문장으로 이루어진 매크로를 만드는 좋은 방법 좀 알려 주세요. Answer 이런 매크로를 만드는 일반적인 방법은 매크로 자체를 일반 함수처럼 쓸 수 있도록 하는 것입니다. 즉 호출하는 쪽에서 마지막 ‘;’을 직접 써 주게 하고 매크로의 몸통에서는 ‘;’을 따로 써 주지 않는 식으로 쓰는 것입니다. 예를 들면: MACRO(arg1, arg2); 그러므로 매크로 정의는 단순히 여러 statement를 중괄호로 둘러싼 ‘compound statement’ 형식으로 만들 수 없습니다. 왜냐하면 이 매크로가 호 출될 때 세미콜론이 추가적으로 붙는다면 if나 if/else 문장에서 에러가 발생할 수 있기 때문입니다. 다음 코드를 보기 바랍니다: if (cond) MACRO(arg1, arg2); ..