2016-03-26 35 views
1

前に、これは実際のマクロです:使用されているすべての定数は十分に定義されている可変個引数マクロ「)」数値定数

#ifdef DEBUG                 
#define debug(funcname, format, ...) \           
     printf(BOLD UNDERLINED REVERSE \          
     "DEBUG IN " __FILE__ \            
     " LINE " __LINE__ ":" \            
     RESET UNDERLINED REVERSE \           
     "In " funcname \             
     RESET REVERSE format RESET, ##__VA_ARGS__)       
#else                   
#define debug(funcname, format, ...)           
#endif                   

文字列定数。 は、私のようなもので、それを呼び出す:

char message[] = "Hello StackOverflow !\n"; 
debug("main()", "Message: %s\n", message); 

しかし、私は決算Parentheseのでメッセージ

error: expected ‘)’ before numeric constant debug("main()", "Message: ", message); poitingを取得します。

私は最初のマクロをテストし、今のプロジェクトは、チームと進んでいること、それは動作しないため

" LINE " __LINE__ ":" 

が構文的に無効に展開するのでそれは...

+0

だけであなたを助けるために、事前に定義された名前: '__func__'(小文字に注意してください)は、関数名を返しますので、あなたは、マクロ呼び出し – user3629249

答えて

5

奇妙であるということです__LINE__ので

" LINE " 42 ":" 

整数ではなく、連結することができる文字列リテラルです。

+0

おかげで男に関数名をハードコーディングする必要はありません!私はそれについて考えていたはずですが、プリプロセッサのエラーメッセージは実際には理解できないことがあります。あなたはフォーマットの '「%dを」'使用して、ちょうど '## __ VA_ARGS__'前に' __LINE__'を移動することによって、いずれかのこの問題を解決することができ@NicolasScottoDiPerto –

+0

。または '__LINE__'拡張を文字列で入力することによって実行できます。 – Jens

関連する問題