2

現在の印刷レベルセットに応じて、ファイル/行番号をエラーメッセージとともに印刷するカスタムprintfを作成しようとしています。同じマクロを定義しました。以下は、プリプロセッサのコードです。

#define DIE (s) \
    printf(s); \
    exit(0); \

#define my_print(level,s) \
if(level <= gPrintLevel) \
{ \
    char *buffer = (char *)malloc(strlen(s)-1); \
    if (NULL != buffer) \
    { \
       sprintf(buffer,s); \
       printf("[%s][%d]:%s\n",__FUNCTION__,__LINE__,buffer); \
       if (level == fatal) \
       {\
          DIE(s);\
       }\
    } \
} \

関数内から次のように上記のプリプロセッサを呼び出しています。

myPrint(2,"Unexpected error encountered\n");

しかし、コンパイルしようとすると、以下のコンパイル エラーが発生します。

41: error: ‘s’ was not declared in this scope

助けてください、私は何を間違っていますか? また、上記のように印刷ステートメントをカスタマイズするよりエレガントな方法があるかどうかを教えていただければ幸いです。前もって感謝します。

4

2 に答える 2

4

個人的には、ユーザーがリテラル形式の文字列を提供することを想定または義務付けるだけです。その場合、文字列を連結できます。

#define MYPRINT(fmt, ...) \
  printf("Function: %s. Line: %d. " fmt "\n", \
         __FUNCTION__, __LINE__, ## __VA_ARGS__);

使用法:

MYPRINT("The flargle %d has unexpected grobule %f", f->q, f->r);

このアプローチでは、書式文字列を静的に分析し、引数の不一致について警告するコンパイラの機能を利用することもできます。

##(コードは、引数リストが空の場合に最後のコンマを削除するために、GCC 拡張を使用します。)

于 2013-10-20T10:53:40.740 に答える
0

助けてくれてありがとう、可変引数マクロのソリューションはうまくいきます。これは現在のマクロの新しい定義です:

#define DIE(fmt) \
do { \
printf(fmt); \
exit(0); \
} while(0); \

#define my_print(x,fmt,...) \
if (x < gPrintLevel) \
{ \
    printf("[%s][%u]:" fmt "\n",__FUNCTION__,__LINE__,##__VA_ARGS__); \
    if (fatal == x) \
    {\
       DIE(fmt) \
    }\
} \
于 2013-10-20T13:01:20.310 に答える