第12講 分割ファイル・分割コンパイル 
第4話 変数の適応範囲
ソースファイルm.cpp
#include"b.h"
#include"a.h"
#include"c.h"
int main(){
   f();
   g();
}
ヘッダーファイルa.h
void f(){
   a=5;
}
ヘッダーファイルb.h
#include<iostream>
using namespace std;
void g(){
  int a;
}
ヘッダーファイルc.h
void h(){
   cout<<a<<endl;
}

エラー 2 error C2065: 'a' : 定義されていない識別子です。 c:\vc++2010\d7\分割ファイル実験\分割ファイル実験\a.h 2
警告 1 warning C4101: 'a' : ローカル変数は 1 度も使われていません。 c:\vc++2010\d7\分割ファイル実験\分割ファイル実験\b.h 4
エラー 3 error C2065: 'a' : 定義されていない識別子です。 c:\vc++2010\d7\分割ファイル実験\分割ファイル実験\c.h 2

そうです。変数の適応範囲は、関数の中にのみに限られているので、
void f(){
   a=5;
}
はエラーするに決まっていますよね。

この講義ではまだ触れていませんでしたが、
グローバル変数というのがあります。
(グローバルスタンダードなどといい、これは世界標準という意味です。
グローバルとは広域を意味します。
グローバル変数に対して、関数の中でしか通用しない変数をローカル変数と言います。
メモリーを無駄遣いするグローバル変数は、
使わず関数の消滅とともに消滅するローカル変数を使うべきだという人もいます。
私も基本的には、ローカル変数のみでプログラミングをすべきだとは思いますが、
限定された形ならグローバル変数を使ってもよいと思います。)

例えば、次のようにコーティングするとエラーしません。
(是非、新規プロジェクト作り実験してみてください。)
#include<iostream>
using namespace std;
int a;
void f();
int main(){
   f();
   cout<<a<<endl;
}
void f(){
   a=5;
}
コンソール画面

入門
int a;がグローバル変数です。グローバル変数の適応範囲は、
c言語
枠の中です。

これを使えば先ほどのエラーは解消されるでしょうか。
ソースファイルm.cpp
#include"b.h"
#include"a.h"
#include"c.h"
int a;
int main(){
   f();
   g();
}
ヘッダーファイルa.h
void f(){
   a=5;
}
ヘッダーファイルb.h
#include<iostream>
using namespace std;
void g(){
  cout<<"グロ張る変数に仕事を奪われた?"<<endl;
}
ヘッダーファイルc.h
void h(){
   cout<<a<<endl;
}

答えは30行下。


















エラー 1 error C2065: 'a' : 定義されていない識別子です。 c:\vc++2010\d7\分割ファイル実験\分割ファイル実験\a.h 2
エラー 2 error C2065: 'a' : 定義されていない識別子です。 c:\vc++2010\d7\分割ファイル実験\分割ファイル実験\c.h 2

void f(){
   a=5;
}

void h(){
   cout<<a<<endl;
}

それぞれのaが未定義だと出てきてしまいます。
当然です。
グローバル=広域と言ってもファイル内でのグローバルにすぎません。
では、ファイルを超えたグローバル変数はないのでしょうか。



第3話へ 第5話へ

戻る

C言語講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)