デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4375  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

元ネタ

確認環境はVS2008

以下の2つのプログラム

test1.c

#include

int hoge;

int main(void) {
??? printf("%d\n", hoge);

??? return 0;
}

?

test2.c

const int hoge = 1;

?

cl test1.c test2.c

して

test1

とすると出力結果は

1

cl test1.c test2.c /Faしてアセンブラのhogeの部分の出力を見ると

test1.asm

_DATA??? SEGMENT
COMM??? _hoge:DWORD
_DATA??? ENDS

test2.asm

PUBLIC??? _hoge
CONST??? SEGMENT
_hoge??? DD??? 01H
CONST??? ENDS
END

因みにtest1.cの宣言をconst int hoge=1;にすると、test1.asmもtest2.asmと同様の出力になるため

fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

が出る。

これでいいのだろうか???

投稿日時 : 2008年9月2日 0:34

コメント

# re: [C] const/非const初期値なしグローバル変数の扱い 2008/09/02 8:14 774RR
C では ODR の規定がないので同一シンボル名が重複したらどうなるかは未規定
古いソースコードとの互換性のために大域静的変数は1つにまとめられる実装が普通
型は関係ない (int/const int が混在しても int/double が混在してもいい)
事実上の union と考えることが出来る
---a.c---
int hoge;
---b.c---
double hoge;
---a.out---
リンクエラーは発生せず hoge は double のサイズで領域が取られる
---
C++ は ODR がきっちり既定されたのでエラーになるのが正しい

# re: [C] const/非const初期値なしグローバル変数の扱い 2008/09/02 8:27 774RR
あっと抜けてる。C でも同一名称の大域変数が1つにまとまるのは
・すべての定義が初期値無しの場合
・1つの定義が初期値有り、他は初期値無しの場合
のみ。複数個に初期値つきだとリンク時重複エラー

# re: [C] const/非const初期値なしグローバル変数の扱い 2008/09/02 23:35 あんどちん
>> 774RRさん
ご説明ありがとうございます。

Cで初期値なし変数がサイズ関係なしで共有されるのはMS-C6がそうやっていたのを見たことがあったので、「そんなもんなのかなぁ」と思っていたのですが、constと初期値なしで纏められるとは思わなかったもので(ってかどっちも普段はやらないようにコード書いちゃうし)。


Post Feedback

タイトル
名前
Url:
コメント: