0

私は次のような関係でいくつかのファイルを書きます:

ファイルああ:

#ifndef MACRO_HEADER
#define MACRO_HEADER
const char* CONST_CHAR_NAME = "name";
#endif

ファイルBh(B.cpp)とファイルCh(C.cpp)にもこの共通型定義ヘッダーが含まれていますAh g ++が最終的にobjファイルをlibに結合すると、再定義エラーが発生します。定数を次のように定義する必要があります。

const char* const CONST_CHAR_NAME = "name"; //This is OK 

しかし、なぜコンパイラーは再定義エラーを私に与えるのですか?const char *は定数値ではありませんか?しかし、typeid.nameを使用してとのタイプをチェックしconst char *ます cosnt char* const。それらは同じです:charconst*。私はエラーと混同しています。

4

3 に答える 3

2

問題は、複数の場所、つまり .h を含むすべてのソース ファイルで同じ変数名を定義していることです。

static次のキーワードを使用して、各定義がソース ファイルに対してローカルであることを宣言することにより、リンカー エラーを排除できます。

static const char* CONST_CHAR_NAME = "name";
于 2012-09-17T03:48:13.227 に答える
1

複数の「翻訳ユニット」で定義さCONST_CHAR_NAMEれているため、エラーが発生します(翻訳ユニットは基本的に単一のソースファイルと含まれるすべてのヘッダーファイルです)。それを宣言してから、1つのソースファイルで定数を定義する必要があります。extern

したがって、ヘッダーファイルでは次のようになります。

extern const char* CONST_CHAR_NAME;

そして、1つのソースファイルで:

const char* CONST_CHAR_NAME = "name";

編集:const char*との違いconst char* const

宣言

const char* CONST_CHAR_NAME;

定数文字列へのポインタを作成します。定数文字列を指している限り、割り当てることができます。つまり、以下の両方の行は問題ありません。

CONST_CHAR_NAME = "foo";
CONST_CHAR_NAME = "bar";

一方、あなたは

const char* const CONST_CHAR_NAME;

上記は、定数文字列への定数ポインタを作成します。これは、ポインタに再度割り当てることができないことを意味するため、上記の2つの割り当ては問題ありません

于 2012-09-17T03:27:44.990 に答える
-1

実際には、次のように宣言する必要があります。

const char CONST_CHAR_NAME[] = "name";
于 2012-09-17T03:32:52.523 に答える