みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

externの使い方(仮)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

externの使い方(仮)

投稿記事 by みけCAT » 12年前

C言語でグローバル変数をほかのファイルから参照したいとき、externを使用しますよね。
しかし、externが使えるのは、グローバル変数をほかのファイルから参照したい時だけではありません。
同じファイル内でも、externを使用してグローバル変数の存在をコンパイラに知らせることができます。
まずは、このコード。

CODE:

#include 

int main(void) {
    for(count=0;count

extern int count;

int main(void) {
    for(count=0;count

int count;

int main(void) {
    for(count=0;count<10;count++)printf("%d\n",count);
    return 0;
}

int count;
http://ideone.com/fKHhKs

二重宣言でコンパイルエラーに…
_人人人人_
>ならない<
 ̄Y^Y^Y^Y ̄
意外でした。

ということは、やっぱりexternが役に立つのはグローバル変数をほかのファイルから参照したい時くらいですかね…

アバター
へにっくす
記事: 634
登録日時: 13年前

Re: externの使い方(仮)

投稿記事 by へにっくす » 12年前

えっまじ??と思ってVisual Studio 2005のコマンドラインで試してみました

CODE:

>cl 1.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1.cpp
1.cpp(10) : error C2086: 'int count' : 再定義されました。
        1.cpp(3) : 'count' の宣言を確認してください。

>
なんだエラーでるじゃん
あれ?C言語だよな?と思って改めて拡張子を.cにしてコンパイル。

CODE:

>cl 1.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:1.exe
1.obj

>
通りやがった。
知らなかったわ…(^^;
最後に編集したユーザー へにっくす on 2013年8月03日(土) 21:06 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 15年前

Re: externの使い方(仮)

投稿記事 by ISLe » 12年前

グローバル変数を使ってはいけないと言われる最大の根拠なんですけどね。
例えばerrnoなんてグローバル変数を定義すると標準ライブラリによってリセットされるとか、どんなライブラリがどんなグローバル変数を定義しているか知らずに使って勝手に値が変わるバグに悩まされることになるわけです。