をターゲットにコンテキストGCCプリプロセッサマクロの値を呼び出す伝播するのは、私がb.c
でf.c
とbar
嘘でfoo
嘘、つまりはb.h
がf.c
に含まれている機能
foo() {
bar();
}
があるとしましょう。
bar() {
printf ("Called from line %d in file %s",?,?);
/* Run as usual */
}
私はpredefined GCC preprocessor macros__LINE__
と__FILE__
からこの二つの情報を入手したい:私はそうのように、それはそれを呼び出す任意の関数foo
から呼び出されたことを印刷するbar
を修正したいと思います。しかし、これらは明らかにprintf
の行に、に単に差し込まれている場合はb.c
に、b.c
にそれぞれパスが評価されます。
bar
で
printf
に呼び出し元のコンテキストから
__LINE__
と
__FILE__
の値を伝播するので、「ファイルfoo.cの行xから呼び出され、」代わりに印刷されていることはできますか?
私はbar2
にbar
の名前を変更して、ヘッダファイルb.h
に委譲機能を定義しようとしました:
bar() {
printf ("Called from line %d in file %s",__LINE__,__FILE__);
bar2();
}
アイデアは#include
ディレクティブは、ソースファイルf.c
にヘッダコードをコピーして置き換えるというものでしたパスはそれぞれf.c
と行番号になります。しかし、これにより、異なる翻訳単位にわたって重複した定義エラーが発生しました。
次に、static
修飾子をヘッダ定義bar2
に追加して、複数の定義を可能にしようとしました。私はエラーなしでコンパイルしてプログラムを実行できますが、それでもなおbar.h
が出力されます。
どこが間違っていますか?これを行うもっとエレガントな方法があると確信しています。
質問:
理由だけではなく、GDBのようなデバッガを使用していませんか?これはカーネルコードです。
なぜ発信者側のデバッグをしないのですか?大規模なコードベース。
EDIT:
なぜこれが動作しませんか?
#ifdef DEBUG_PALLOC
#define palloc_get_page(FLAGS) (palloc_get_page_debug (FLAGS, __FILE__,__LINE__))
#else
void *palloc_get_page (enum palloc_flags);
#endif
パラメータとして渡す必要があります。 OT:FAQが何を意味するのか知っていますか? –
おっと、私の悪い。 FAQを質問に置き換えました。 返信いただきありがとうございます。なぜこれができないのか教えていただけますか?関数のローカル定義をどこに含めても構いませんが、それは印刷後にグローバルシンボルを指しますか? –