ページ 11

const変数について

Posted: 2012年7月20日(金) 01:46
by atori
またもやファイル分割で悩んでおります。
やはりソースを見てもらうのが一番早いと思ったので、下に載せます。
変数名などはテスト用プログラムなので適当にしております。

main.h

コード:

#ifndef _MAIN_H_
#define _MAIN_H_

#ifdef _MAIN_
const int    a = 0;
#else
extern const int    a;
#endif
#endif
main.c

コード:

#define _MAIN_
#include "main.h"

void main(void)
{
    Test();
}
Test.c

コード:

#include "main.h"

void Test(void)
{
    int    b;
    b = a;
}
これをビルドすると「外部シンボル"int const a"は未解決」というリンクエラーが出てしまいます。
変数定義、extern宣言のconstを外すとエラーは出ません。

何が問題なのでしょうか?

Re: const変数について

Posted: 2012年7月20日(金) 02:59
by ISLe
本当にmain.cとTest.cですか?cppではなくて?
cであればリンクエラーにならないはずですが。

C++だとconst宣言されたオブジェクトはデフォルトで内部結合になって他の翻訳単位から参照できません。
externを両方ともに付ければ良いですが、ヘッダファイルの書き方自体が良くないです。

ヘッダには
extern const int a;
と書いて
main.c(cpp?)に
const int a = 0;
と書くようにしましょう。

(追記)
constの定数としての扱いもCとC++で異なります。
C++だとconst intをswitchのcaseに使えますが、Cだと使えません。
CとC++をごっちゃにしないよう気を付けましょう。

Re: const変数について

Posted: 2012年7月20日(金) 10:21
by atori
返信ありがとうございます。
確かにcではなく、cppでした。失礼しました。

言われた通りヘッダファイルにはextern宣言のみを書き、main.cppのグローバル領域で実体化すると
エラーを出すこと無くビルド出来ました。

cとcppでの違いも教えていただきありがとうございました。