第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;がグローバル変数です。グローバル変数の適応範囲は、
枠の中です。
これを使えば先ほどのエラーは解消されるでしょうか。
ソースファイル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が未定義だと出てきてしまいます。
当然です。
グローバル=広域と言ってもファイル内でのグローバルにすぎません。
では、ファイルを超えたグローバル変数はないのでしょうか。
C言語講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)