0

簡単な方法で Android ndk にメッセージを記録するヘルパー クラスを使用しています。それは次のように機能します:

LOGE("ClassTag", "Message");

何かをログに記録するたびにタグを手動で記述したくないので、すべてのクラス定義に対して TAG 定数を定義します。

#define  TAG    "Class1Tag"

そして、次のようにしてログに記録できます。

LOGE(TAG, "Message");

この問題は、TAG 定数が定義されているクラスに、同じ TAG 定数が宣言されている別のクラスが含まれている場合に発生します。次に、次のコンパイル エラーが表示されます。

error: "TAG" redefined

#define ごとに異なる識別子を使用せずに再定義を取り除くにはどうすればよいですか?

4

4 に答える 4

2

ヘッダー ファイルで TAG 値を定義しているようです。このタイプのものを適切に動作させるには、実装ファイルでのみ定義する必要があります。実装ファイルは他のファイルに含まれていないため、再定義はありません。

これが意味することの 1 つは、ロギング ステートメントは実装ファイルでのみ発生する可能性があるということです。

于 2013-03-10T18:47:12.340 に答える
1

いくつかの異なるヘッダー ファイルで同じ識別子を定義すると、必要な動作が得られない可能性があります。特定の実装ファイルでは、識別子の値は、必ずしもクラスに関連付けられたものではなく、最後に定義されたものになります。「最後に定義されたもの」は、実装ファイルに含まれる最後のヘッダー ファイルのものになります。

ああ:

#define TAG "ClassA"

bh:

#define TAG "ClassB"

a.cpp:

#include "a.h"
#include "b.h"

この例では、a.cpp での TAG の使用は、値「ClassB」を持ちます。

基本的に、ヘッダーファイルで識別子を再定義する必要はありません。別の実装ファイルの識別子と同じ識別子を実装ファイルに定義すると、他の実装ファイルをコンパイルするときに表示されないため、機能します。しかし、コンパイラが文句を言っているのには理由があります。混乱を避けるために、コンパイラの指示に注意する必要があります。

編集:コンパイラがエラーとしてフラグを立てていることは知っています。私が言ったことの結論は、あなたが持っているものを受け入れるためにコンパイラの苦情を緩和しないことです.それはおそらく混乱を招くからです.

于 2013-03-10T18:52:31.213 に答える
1

ヘッダーではなく、それぞれの .cpp ファイルで定義します。

または、private、static、const std::string、または の配列charを使用すると、他のクラスからは見えなくても、ヘッダーでログ ステートメントを使用できます。

于 2013-03-10T18:46:44.820 に答える
0

#under TAG前に使わない理由#define TAG "ClassTag"

于 2013-03-10T18:46:49.173 に答える