2012-05-14 4 views
3

메시지가 표시된 후에 프로그램을 종료 할 가능성이 있으므로 오류 메시지를 표시하는 제네릭 함수를 만들려고합니다.함수의 C++ 매크로 및 기본 인수

원본 파일과 오류가 발생한 행을 표시하는 기능을 원합니다.

인수 목록 :

1.char *desc //description of the error 
2.char *file_name //source file from which the function has been called 
3.u_int line //line at which the function has been called 
4.bool bexit=false //true if the program should exit after displaying the error 
5.int code=0 //exit code 

의 때문에 (4), (5) 내가 프로그램을 종료해야하지 않는 한 그들을 지정하지 않기 때문에, 함수 정의에 기본 인수를 사용해야합니다.

(2) 및 (3) 나 이와 같은 원시 함수로 리디렉션 매크로를 사용하는 것이 필요한 이유는

#define Error(desc, ???) _Error(desc,__FILE,__LINE__, ???) 

문제 나 방법 그 2 개 요소를 참조하지 않는다는 것이다 함께 일해야합니다.

가 같이하는 방법의 예 : 당신은 C99에서 매크로를 오버로드 할 수 없습니다

if(!RegisterClassEx(&wndcls)) 
    Error("Failed to register class",true,1); //displays the error and exits with exit code 1 

if(!p) 
    Error("Invalid pointer"); //displays the error and continues 
+1

http://stackoverflow.com/questions/679979/how-to-make-a-variadic-macro-variable-number-of-arguments (어쩌면 http://stackoverflow.com/questions/10582500/c) -macro-and-default-arguments-in-function) – Vlad

+0

__VA_ARGS__ 전에 '##'을 추가하면 실제로 variadic 매크로를 사용해 보았습니다. 그러나 ##이 없으면 작동하지 않았습니다. 덕분에 –

+0

당신은 환영합니다 : -) – Vlad

답변

1

- 두 개의 서로 다른 매크로가 필요합니다. C11에서는 _Generic을 사용하여 몇 가지 희망이 있습니다.

매크로를 사용하여 Visual Studio 용 사용자 지정 경고 생성기 스 니펫을 매우 유사하게 개발했습니다. GNU GCC는 MSVS와의 호환성을 위해 유사한 설정을하고 있습니다.

#define STR2(x) #x 
#define STR1(x) STR2(x) 
#define LOC __FILE__ “(“STR1(__LINE__)”) : Warning Msg: “ 
#define ERROR_BUILDER(x) printf(__FILE__ " (“STR1(__LINE__)”) : Error Msg: ” __FUNCTION__ ” requires ” #x) 

위의 라인은 매크로 내에서 exit() 전화를 삽입 할 필요 사에 대한 지원을 추가 한 3에 인수주의해야합니다. 또한 두 개의 다른 매크로 랩퍼를 작성해야합니다. 두 개의 다른 인수 목록 (기본 인수가있는 매크로 목록이 다른 매크로에 위임 할 수 있음)이 필요합니다.

#define ERROR_AND_EXIT(msg, cond, errorcode) ERROR_BUILDER(msg) if (cond) exit(errorcode) 
#define ERROR_AND_CONT(msg) ERROR_BUILDER(msg) 

내가 자세한 설명 here 넣어했다 (경고 : 내 블로그의 - 너무 뻔뻔한 플러그로 그것을 고려).