0

マクロを作成してログをファイルに出力しようとしています。私のマクロは次のようになります。

#define LOG(fmt,...){\
    FILE *F;\
    F = fopen("output.txt","a");\
    fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}

そして、次の形式で LOG を呼び出す予定です。

LOG("values are : %d %d",num1,num2);

しかし、コンパイルするとエラーが発生します

error: expected expression before ‘,’ token
     fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}

誰かが私がどこで間違っているのか説明してもらえますか?

4

2 に答える 2

3

まず、マクロを do-while ループにラップする必要があります。これにより、式で正しく処理されます。

#define LOG( fmt , ... ) do{  }while(0)

次に、 fopen() 呼び出しが成功すること、および使用後にファイルを閉じることを確認する必要があります。

FILE* f = fopen( "output.txt" , "a" ) ;
if( !f )
    break ;    //break works because you are in a loop
fclose( f ) ;    //also flushes the stream

次に、印刷を完全なマクロに含めます。

#define LOG( fmt , ... )    \
        do{ \
            FILE* f = fopen( "output.txt" , "a" ) ; \
            if( !f )    \
                break ; \
            fprintf(f, fmt" %s %d\n",__VA_ARGS__,__FILE__,__LINE__);    \
            fclose( f ) ;   \
        }while( 0 )

呼び出しは次の形式です。

LOG("values are : %d %d",4444,55555);

ここで、文字列内の対応するフラグを使用して、少なくとも 1 つの正しいオプション パラメータを入力する必要があります。

于 2014-10-10T18:20:10.220 に答える
2
#define LOG(fmt,...){\
    FILE *F;\
    F = fopen("output.txt","a");\
    fprintf(F,fmt " %d %d",__VA_ARGS__,__FILE__,__LINE__);}

複数の問題

  1. あなたは決してfcloseF.
  2. __FILE__は文字列です。
  3. パラメータなしで呼び出すことができるようにしたい場合__VA_ARGS__は、最後に行く必要があります...
  4. ... または、この小さなハックを使用します。

    #define LOG(fmt,...){\
        FILE *F;\
        F = fopen("output.txt","a");\
        fprintf(F,fmt " %s %d", ##__VA_ARGS__, __FILE__,__LINE__);}
    

(は、引数がない場合に前のコンマを削除する##__VA_ARGS__GCC 拡張機能です)。

「カスタム」printfのような関数に関するこの回答もチェックしてください。

于 2014-10-10T17:52:42.673 に答える