2017-02-14 8 views
0

매크로 함수에 대한 인수로 매크로 상수를 전달하는 동안 문제가 발생합니다.다른 매크로를 인수로 사용하여 C 매크로 호출

#define ERROR 10 
#define MAIN "Main:" 

#define LOG(lvl,mod,fmt,...) \ 
    char msg[256] = {0}; \ 
    snprintf(msg, 256, "%s: %d: "fmt,mod,lvl,##__VA_ARGS__) 

int main() 
{ .... 
    LOG(ERROR, MAIN, "This is a log statement.\n"); // Doesn't compile 
    LOG(10, "Main:", "This is a log statement.\n"); // Compiles 
    .... 
} 

두 번째 로그 문 컴파일하지만 첫 번째 로그 문을 다음과 같은 컴파일 오류가 발생 - -

error: expected `)' before ‘;’ token 
error: expected primary-expression before ‘,’ token 
error: expected `;' before ‘)’ token 

왜 이런 일이를

다음 코드를 고려? 로깅 수준 및 모듈 상수 집합을 정의하고 LOG() 매크로를 호출하는 동안이를 사용할 수 있기를 원합니다.

+3

관련없는,하지만 당신의'LOG' 매크로는 단순한'if' 문 또는 루프 본문없이 작동하지 않습니다 명시 적 브레이커. 대부분의 사람들이'do {...} while (0)'을 사용하여 다중 문장 매크로를 작성하는 이유가 있습니다. –

+6

매크로는 동일한 범위 내에서 여러 개의'msg' 변수를 선언 할 때 깨집니다. – Droppy

+1

문제를 해결하는 방법은 매크로 확장이 생성하는 코드를 확인하기 위해 전 처리기를 실행 한 후 컴파일러에게 중단하도록 알리십시오. –

답변

0

은 내가 볼 수 두 가지 문제가 있습니다

  1. 당신은 같은 범위 내에서 여러 msg 변수를해야합니다.
  2. 쉼표가 누락되었습니다 (@ Ninethedo에서 지적한 바와 같이).
  3. 형식이 지정된 문자열은 사용하지 않습니다.

로깅 수준을 허용하고 매크로를 사용하여이를 호출하는 것을 단축하는 전역 logger() 함수를 선언하는 것이 좋습니다.

+0

누락 된 쉼표는 문제가되지 않습니다. 문자열 상수의 연결을 허용합니다. –

+0

@JohnnyMopp True. 수정 됨. – Droppy

+0

아마도 실제 코드는'msg'를 사용하여 무언가를하지만, 질문과 관련이 없으므로 생략되었습니다. – rici

0

매크로의 한 가지 문제점은 C89에서 허용하지 않는 코드 블록의 임의의 지점에서 변수를 선언한다는 것입니다. 즉, 블록의 맨 위에 만 변수를 선언 할 수있었습니다. C99 컴파일러를 사용하더라도 동일한 범위에서 같은 이름의 여러 선언을 도입 할 수 있으므로 문제가 해결되지 않습니다. 이는 금지되어 있습니다.

는이 문제가 해결하기 위해 do/while(0) trick을 사용할 수 있습니다 : 당신의 (현재) 문제에 대한

#define LOG(lvl,mod,fmt,...) do {\ 
    char msg[256] = {0}; \ 
    snprintf(msg, 256, "%s: %d: "fmt,mod,lvl,##__VA_ARGS__) \ 
} while(0) 
+0

또한 OP가 처음 두 인수에 대해 매크로를 사용하지 않을 때 왜 두 번째 변형이 컴파일되는지 설명하지 않습니다. –

+1

@Someprogrammerdude 가장 가능성있는 이유는 OP의 코드 앞에는 뭔가가 있다는 것인데, 왜냐하면 OP 코드의 코드를 컴파일 할 때 완벽하게 ([데모] (http://ideone.com/F9TW7H)). – dasblinkenlight

+0

실제 코드에서 생성자 내에서이 LOG 매크로를 호출하고 있는데 이것은 생성자의 맨 처음 명령어입니다. 또한 매크로는 호출되는 위치와 다른 .h 파일에 정의됩니다. .h 파일에는 위의 예제와 동일한 순서로 매크로 정의가 있습니다. 매크로 정의의 순서가 이것과 관련이 있습니까? – siri