2

最も単純な log_debug マクロを作成しようとしています:

#define log_debug(fmt, ...) printf("%s:%d "##fmt, __FILE__, __LINE__, __VA_ARGS__);

主な理由は、行番号とファイル名を取得することです。しかし、どういうわけか動作しません (コンパイル エラー):

error: pasting ""%s:%d "" and ""error value: %d\n"" does not give a valid preprocessing token

他に書き直す方法はありますか?

4

3 に答える 3

3

エラーは、連結によって次が生成されるためです。

 "%s:%d""error value: %d\n"

これは、連結が期待する単一のトークンではなく、2 つのトークンです。

##この場合、連続する文字列リテラルは暗黙的に結合されるため、実際には必要ありません。

... printf("%s:%d " fmt,  ...
于 2013-07-30T07:06:40.817 に答える
3

確かに、C では、隣接する文字列リテラルは自動的に結合されます。どうですか

#define log_debug(fmt, ...) printf("%s:%d " fmt, __FILE__, __LINE__, __VA_ARGS__)
                                           ^^ '##' removed
于 2013-07-30T07:03:44.470 に答える