extern constはできる?

解決


アマチュア  2005-06-23 21:03:22  No: 58023

すいません、少し教えて下さい。

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 なし。


YuO  2005-06-23 21:14:36  No: 58024

> 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以外の変数。


アマチュア  2005-06-23 22:36:28  No: 58025

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 なのに値が設定されていないとエラーになります。
(当然なのですが一応確認致しました^^;)

説明不足・理解不足であれば申し訳ありません。

他に何か対処法、またはつっこみはありますでしょうか?


isshi  2005-06-24 01:39:53  No: 58026

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 は内部結合になるのでしょうか?


Ban  2005-06-24 02:10:04  No: 58027

> extern なしの const は内部結合になるのでしょうか?

IS / JIS X3014 の 3.5 3 を見る限りそうですね。


アマチュア  2005-06-24 02:21:43  No: 58028

皆さん色々とありがとうございます。

内部結合とは具体的にどういうことなのでしょうか・・・?
グローバルにではなく、ローカルになるということでしょうか?

申し訳ありませんがご指導頂けたらと思います。


isshi  2005-06-24 02:37:06  No: 58029

>IS / JIS X3014 の 3.5 3 を見る限りそうですね。
ありがとうございました。ばっちり書いてありました。
質問の前に調べてはみたのですが検索が甘かったです。。

>内部結合とは具体的にどういうことなのでしょうか・・・?
コンパイル単位内(1つのcppファイル内)で有効ということです。


Ban  2005-06-24 03:11:22  No: 58030

const は C -> C++ でデフォルトが外部 -> 内部結合に変更になってますから、
既存がC のコードだったり、なまじ C の知識があるとはまるのかも。


アマチュア  2005-06-24 03:31:55  No: 58031

issahiさんBanさんありがとうございます。

> コンパイル単位内(1つのcppファイル内)で有効ということです。
> const は C -> C++ でデフォルトが外部 -> 内部結合に変更になってますか> ら
なるほど。

おかげですっきりです。

無事解決とさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加