const変数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
atori
記事: 43
登録日時: 13年前

const変数について

#1

投稿記事 by atori » 13年前

またもやファイル分割で悩んでおります。
やはりソースを見てもらうのが一番早いと思ったので、下に載せます。
変数名などはテスト用プログラムなので適当にしております。

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を外すとエラーは出ません。

何が問題なのでしょうか?
Done is better than perfect.(Mark Elliot Zuckerberg)

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: const変数について

#2

投稿記事 by ISLe » 13年前

本当に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++をごっちゃにしないよう気を付けましょう。

atori
記事: 43
登録日時: 13年前

Re: const変数について

#3

投稿記事 by atori » 13年前

返信ありがとうございます。
確かにcではなく、cppでした。失礼しました。

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

cとcppでの違いも教えていただきありがとうございました。
Done is better than perfect.(Mark Elliot Zuckerberg)

閉鎖

“C言語何でも質問掲示板” へ戻る