C++ヘッダファイルで変数constとstaticを宣言

3156 ワード

背景
通常の書き込みプログラムでは、グローバル変数を使用する必要がありますが、ヘッダファイル(.hファイル)で変数(const定数以外)を宣言する場合、.cppファイルincludeというヘッダファイルが複数ある場合に複数回定義されたエラーが発生します.a.hファイルでは、
// a.h   
#include
int a ;
void f();

a.ccファイルでは:
// a.cc   
#include "a.h"

void f() {
    a = 2;
    std::cout << "a.cc: " << a << std::endl;
}

メールでccファイル中
#include "a.h"

int main() {
    std::cout << "main: " << a << std::endl;
    f();
    return 0;
}

コンパイル中にエラーが発生しました:multiple definition of "a".a変数を複数回定義した.ここには2つの知識点があります.1.コンパイル時にinlcude操作が実行されます.hファイルのすべての内容は.ccファイル.2.プログラムには複数の宣言がありますが、定義は1つしかありません.a.hファイルにおけるint aは変数定義であり、include操作時に複数である.ccファイルには複数のa変数の定義が含まれており、コンパイルエラーが発生します.c++プログラムをどのようにコンパイルして実行するかに興味がある場合は、この記事を参照してください.How C++Works:Understanding Compilation.
どのような場合にヘッダファイルで変数を宣言できますか?
ケース1:変数を書く.ccファイルでは、ヘッダファイルに「extern」キーを使用
上記のコードを次のように変更できます.
// a.h   
#include
extern int a;
void f();

a.ccファイルでは:
// a.cc   
#include "a.h"

void f() {
    a = 2;
    std::cout << "a.cc: " << a << std::endl;
}

メールでccファイル中
#include "a.h"
int a;
int main() {
    std::cout << "main: " << a << std::endl;
    f();
    return 0;
}

これでaというグローバル変数を使用できます.
ケース2:ヘッダファイル変数はconstキーワードを使用する
// a.h   
#include
const int a;
void f();

a.ccファイルでは:
// a.cc   
#include "a.h"

void f() {
    std::cout << "a.cc: " << a << std::endl;
}

メールでccファイル中
#include "a.h"
int main() {
    std::cout << "main: " << a << std::endl;
    f();
    return 0;
}

これにより、コンパイルが実行され、正しく実行されます.
main: 2
a.cc: 2

これはconstオブジェクトがデフォルトでファイルのローカル変数であり、それを含むファイルにのみ表示され、他のコンパイルユニットには表示されないためです.したがって、定義を繰り返すエラーは発生しません.
ケース3:ヘッダファイル変数staticキーワードの使用
コードは次のとおりです.
// a.h   
#include
static int a;
void f();

a.ccファイルでは:
// a.cc   
#include "a.h"

void f() {
    a = 2;
    std::cout << "a.cc: " << a << std::endl;
}

メールでccファイル中
#include "a.h"

int main() {
    a = 1;
    std::cout << "main: " << a << std::endl;
    f();
    std::cout << "main: " << a << std::endl;

    return 0;
}

実行結果は次のとおりです.
main: 1
a.cc: 2
main: 1

プログラムはコンパイルに成功したが,a変数の値はグローバル変数ではないことがわかる.f()関数のaに対する修正はmain関数のaの値に影響しない.これは、静的変数がグローバルストレージ領域に格納され、その役割ドメインは現在のコンパイルユニットでのみ有効になるためです.つまりa.ccファイルでmain.ccファイルのaは2つの異なる変数であるため、a.ccの関数がaの値を変更する際にmainのaの値に影響を与えない.
参考文献
C++ヘッダファイルグローバル変数Declaring variables in header files C+[duplicate]Define constant variables in C++header How C++Works:Understanding Compilation