C++externグローバル変数

3529 ワード

C++externグローバル変数
@2018-11-15
C++でマルチファイルを作成する際、複数のファイルが1つのヘッダファイルにグローバル変数を宣言し、他のファイルと一緒に使用できるかどうか疑問に思っています.しかし、これまで研究したことがないので、このようにするといつも間違いがあるので、今日まとめてみましょう.宣言と定義:変数にとって、一般的には両者に違いはありません.宣言はコンパイラにこれが存在することを知らせ、コンパイル時に間違ってはいけません.定義はこれに特定のメモリ空間を割り当てることです.公式解釈:
変数を宣言するのは、変数名識別子に関する情報をコンパイラに伝え、その識別子をコンパイラに「認識」させるだけですが、メモリの割り当てを引き起こすとは限りません.変数の定義は、対応するタイプのデータを格納するために変数にメモリ領域を割り当てることを意味し、変数名は対応するメモリユニットの名前です.
C++プログラムでは、ほとんどの場合、変数宣言は変数定義であり、変数を宣言すると同時に変数の定義が完了します.外部変数を宣言する場合のみ例外です.
今日お話しするのは、上記の外部変数、すなわち、マルチファイルで共通に使用される変数です.私たちはexternの概念を導入した.宣言変数:
extern int i;

変数の定義:
int i = 1;

仮に私たちが今1つのヘッダファイル、2つのcppファイル、それぞれ“hello.hpp”、“hello.cpp”、“main.cpp”.
//hello.hpp
#ifndef _HELLO_HPP
#define _HELLO_HPP
extern int test;
#endif
//hello.cpp
#include"hello.hpp"
int test = 5;
//main.cpp
#include
#include"hello.hpp"
//extern int test;
int main()
{
	std::cout << test << std::endl;
	return 0;
}

hello.hppヘッダファイルのexternは変数test,helloを宣言した.cppソースファイルにこの変数が定義され、メモリ領域が割り当てられています.main.cppでは変数testを直接呼び出す宣言はなく、両方のソースファイルがincludeしたhello.hpp. 皆さんはこのような報告が間違っているのではないかと推測しています.
テストによると、ubuntu g++コンパイルとwindows visual studioコンパイルではエラーは報告されず、DevC++でエラーが報告された(謎のエラー)、どうせ私は今もDevC++を使わないので、このエラーも深く究明する必要はありません.とにかく、上のコードは正しいです.mainにかかわらず.cppにextern int testが注釈されているかどうか.このコードはすべてコンパイルして実行することができ、つまり、後で複数のファイルを使用していくつかのグローバル変数を共有する場合は、上に倣ってヘッダファイルのexternで変数を宣言し、そのうちの1つのcppで定義してメモリに割り当て、他のcppではプログラムの可読性のためにextern宣言を加えたほうがよい.(そうでなければ変数がどこから出てくるのか分からない)結局、変数の再定義の問題なのか、変数は一度しか定義できませんが、何度も宣言することができ、何度も定義するとエラーになりますので、マルチファイルを書くときは注意しなければなりません.