NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

投稿者: さん  2004/03/21 20:59  MLNo.439   [メール表示]

はじめての投稿です。よろしくお願いします。
グローバル変数についてちょっと質問したいのですが。
2つ以上のソースファイルで共通に使用したい変数は

まず、変数の定義を一つのソースで行いメモリに領域を確保し、
他のソースから参照したい場合は extern での宣言が普通だと思っていたのですが
2つのソースファイルで同じ変数を定義した場合にも共有できてしまうことが
最近わかったのですが、これはあたりまえのことなのでしょうか?

たまたまヘッダーファイルにグローバル変数をまとめて、それを2つソースから
インクルードしてしまった時に気が付いたのですが、、、。
問題のないコーディングなのでしょうか?

解りにくい文章ですみません。
以下に簡単なソースを書きます。
ちなみに、gcc 3.2.2 でコンパイルしています。

/* file_1.c *****************************************/
#include <stdio.h>

extern int func();

int global;

int main(void)
{
global = 2;
func();

printf("file_1: adr = %p val = %d\n", &global, global);

return(0);
}

/* file_2.c *******************************************/

#include <stdio.h>

int global;

int func(void)
{
printf("file_2: adr = %p val = %d\n", &global, global);

return(0);
}

上記 file_1.c と file_2.c をコンパイル、リンクし実行すると

file_2: adr = 0x804957c val = 2
file_1: adr = 0x804957c val = 2

といった結果になり、共有していることがわかります。


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


  • MLNo.440   "Isao SHIMAKURA"さん  (0) 2004/03/22 01:10  [メール表示する]
     島倉です。

    > 2つのソースファイルで同じ変数を定義した場合にも共有できてしまうことが
    > 最近わかったのですが、これはあたりまえのことなのでしょうか?

     処理系(細かく言うとリンカ)に依存します。
     大昔はあたりまえだったのですが、いまはあたりまえではなくな
    りました。

     手元の処理系で試してみました。

     Visual C++ 6 警告なし 同じアドレス
    Borland C++ Compiler 5.5 警告あり 異なるアドレス

     ちなみに、拡張子をcppにすると、

     Visual C++ 6 エラー
    Borland C++ Compiler 5.5 警告あり 異なるアドレス

    でした。

    Isao SHIMAKURA (ISLe)
    isle.shimakura@…

    ----- Original Message -----
    From: "Y.Mizuoka" <miz@…>
    To: <beginers@…>
    Sent: Sunday, March 21, 2004 8:59 PM
    Subject: [beginers:0439] Message for beginers


  • MLNo.441   さん  (0) 2004/03/22 23:04  [メール表示する]
    >  処理系(細かく言うとリンカ)に依存します。
    >  大昔はあたりまえだったのですが、いまはあたりまえではなくな
    > りました。

    島倉さまありがとうございます。
    なるほど〜。
    手元に GNU C Compiler しかないので、チェックできませんが、、、。
    やはり、よろしくない書き方ということでいいんですよね。

    >  手元の処理系で試してみました。
    >
    >  Visual C++ 6 警告なし 同じアドレス
    > Borland C++ Compiler 5.5 警告あり 異なるアドレス
    >
    >  ちなみに、拡張子をcppにすると、
    >
    >  Visual C++ 6 エラー
    > Borland C++ Compiler 5.5 警告あり 異なるアドレス

    処理系でここまで違う結果になるとは驚きです。
    今まで自分の環境のことしか考えていなかったです、、、。
    勉強になりました。
    ありがとうございました。



メールへの返信はMLのメンバーしかできません。

更新順メールリスト