1

私の C アプリケーションには、次のようなロギング メソッドがあります。

void logError(const char* module, const char* message, ... );

このメソッドが呼び出されると、呼び出し元は次のようなことを行うことがよくあります。

logError("foo", "bar");

// or even

#define FOOMODULE "foo"
logError(FOOMODULE, "bar");

char*モジュールがどのように渡されchar*ても、アプリケーション バイナリに格納される静的メモリです。

私の質問は、コンパイラ/リンカーは、静的に宣言された文字列のすべてのインスタンスを単一の宣言に折りたたむのですか? そのため、静的に宣言された文字列のポインター ( ) を比較すると、"foo" == FOOMODULE常に期待どおりに機能すると仮定することは有効ですか (もちろん、文字列上記の例のように同等であり、両方がアプリの実際に静的に割り当てられていると仮定します)バイナリ)?

受信したログ メッセージをフィルタリングする方法に取り組んでいます。たとえば、単一の「モジュール」からのログ メッセージのみを表示したい場合があります。特定のログ メッセージを実際に出力するかどうかを決定する際に、文字列内の各バイトではなくポインターを比較するとよいでしょう。

ありがとう!

4

2 に答える 2

3

多くの場合は機能しますが、保証されていないため、このような比較は使用しないでください。

于 2012-12-12T03:42:08.680 に答える
2

意図的に違う回答をします。

これを行う場合は、確実なテスト ケースを作成してください。これが機能するかどうかは、コンパイラと有効な最適化の両方に依存するためです。標準では、文字列定数の重複排除を許可していますが、必須ではありません。

于 2012-12-12T03:48:46.660 に答える