すいません、少し教えて下さい。
static const char x = 1;
と宣言した場合に、
他ファイルから
extern const char x;
とすると、以下のエラーがでてしまします。
xxx.obj : error LNK2001: 外部シンボル ""char const x" (?x@@3DB)" は未解決です。
他にも同じように宣言している変数はあるのですが、
const している変数のみエラーがでてしまいます。
const に対して extern することはできないのでしょうか?
(そんなことはないと思っているのですが)
OS XP, VC++2005, MFC なし。
> static const char x = 1;
> と宣言した場合に、
このxは内部結合を持ちます。
> 他ファイルから
> extern const char x;
> とすると、以下のエラーがでてしまします。
> xxx.obj : error LNK2001: 外部シンボル ""char const x" (?x@@3DB)" は未解決です。
extern付き・初期化子無しの宣言は定義ではないですから,
どこかに外部結合を持つ定義が必要になります。
> 他にも同じように宣言している変数はあるのですが、
> const している変数のみエラーがでてしまいます。
extern const char x;
const char x = 1;
とすれば,xは外部結合を持つので,エラーにならないはずです。
# 実体がないのにエラーにならないのはなんか変……<const以外の変数。
YuOさんありがとうございます。
未だ理解が及んでいないのですが、
> static const char x = 1;
と、するとstaticがそれを外部に対して隠すという意味になってしまうことを確認しました。
↑のコードの抜粋では少し説明が行き届いていなかったかと思いますので、
さらに抜粋、
#ifdef GLOBAL_EXTERN
const char x = 1;
const char y = 2;
char key_flg = 0;
float Rank = 0;
#else
extern const char x;
extern const char y;
extern char key_flg;
extern float Rank;
#endif
の、ような形です。
1つのファイルでは
#define GLOBAL_EXTERN
を定義し、それ以外では定義していません。
ので、
> extern const char x;
> const char x = 1;
は、↑で既に const char x = 1 と、しているのでエラーになり、
const char x = 1; を const char x; にし、
extern const char x;
const char x = 1;
と、すると、
const char x;
に、対してconst なのに値が設定されていないとエラーになります。
(当然なのですが一応確認致しました^^;)
説明不足・理解不足であれば申し訳ありません。
他に何か対処法、またはつっこみはありますでしょうか?
YuOさんの
>extern const char x;
>const char x = 1;
をヒントに以下のコードでコンパイル、リンクできました。(VC7.1)
-- hoge.h --
extern const char x;
#ifdef GLOBAL_EXTERN
const char x = 1;
#endif
私も以前かなり悩み結局解決できずにいました。
const でなければ、
#ifdef GLOBAL_EXTERN
char x = 1;
#else
extern char x;
#endif
でリンクが通りますが、
#ifdef GLOBAL_EXTERN
const char x = 1;
#else
extern const char x;
#endif
と const を付けると通らなくなります。
extern なしの const は内部結合になるのでしょうか?
> extern なしの const は内部結合になるのでしょうか?
IS / JIS X3014 の 3.5 3 を見る限りそうですね。
皆さん色々とありがとうございます。
内部結合とは具体的にどういうことなのでしょうか・・・?
グローバルにではなく、ローカルになるということでしょうか?
申し訳ありませんがご指導頂けたらと思います。
>IS / JIS X3014 の 3.5 3 を見る限りそうですね。
ありがとうございました。ばっちり書いてありました。
質問の前に調べてはみたのですが検索が甘かったです。。
>内部結合とは具体的にどういうことなのでしょうか・・・?
コンパイル単位内(1つのcppファイル内)で有効ということです。
const は C -> C++ でデフォルトが外部 -> 内部結合に変更になってますから、
既存がC のコードだったり、なまじ C の知識があるとはまるのかも。
issahiさんBanさんありがとうございます。
> コンパイル単位内(1つのcppファイル内)で有効ということです。
> const は C -> C++ でデフォルトが外部 -> 内部結合に変更になってますか> ら
なるほど。
おかげですっきりです。
無事解決とさせて頂きます。
ツイート | ![]() |