のマクロ展開を回避することは、このようなものです:CPP:私は(ログ記録の目的のために)やってみたいどのようなマクロ関数のパラメータ
このコードは私の問題を表示するように書かれている、実際のコードが複雑で、はい私も、Cでマクロを使用するには十分な理由を持っている++ =)
# define LIB_SOME 1
# define LIB_OTHER 2
# define WHERE "at file #a, line #l, function #f: "
// (look for syntax hightlighting error at SO xd)
# define LOG_ERROR_SIMPLE(ptr, lib, str) ptr->log ("ERROR " str \
" at library " #lib);
# define LOG_ERROR(ptr, lib, str) LOG_ERROR_SIMPLE(ptr, lib, WHERE str)
LOG_ERROR_SIMPLE (this, LIB_SOME, "doing something")
LOG_ERROR (this, LIB_OTHER, "doing something else")
LOG_ERROR_SIMPLE()
は、libのパラメータ( "「で囲まれたマクロ名)
の文字列化を書き込みますが、その後LOG_ERROR
は、マクロの文字列化を書き込み既に展開しているd(「2」)となる。 libが拡張してLOG_ERROR_SIMPLE
を呼び出す前に拡張されているので、これは予想されます。これは私が必要なものではありません。
基本的に私の質問はこれです別のマクロ関数を呼び出すときにマクロ関数のパラメータをマクロ展開しないようにするにはどうすればよいですか?
私はマクロ展開を回避使用トリックがある:
LOG_ERROR(ptr, lib, str, x) LOG_ERROR_SIMPLE(ptr, x##lib, WHERE str)
LOG_ERROR(this, LIB_OTHER, "some error",)
(xおよびLIBを貼り付けることLIB_OTHER
を生成し、この値がLOG_ERROR_SIMPLE
を呼び出すために使用され、そのないマクロはその呼び出しの前拡張)
トリックを使用せずにこの同じ動作を取得するにはいくつかの方法がありますか?
GCCのプリプロセッサ(存在しない '#include 'を削除する)を使用すると、stdoutに正しいプログラムが得られますが、stderrにはエラーメッセージが出ます。 t.c:11:1:error:貼り付け "、" "BAR"が有効な前処理トークンを与えていない –
gcc/g ++で動作しない –
"うまくいかない"というのは少し強いです。私は 'gcc -E t.c'を実行したときにstdout上でコンパイル可能なプログラムを手に入れました。 –