在 C++ 中,若在頭文件中直接定義結構體並實例化全局對象,多個 .cpp 文件包含該頭文件時會導致「重定義符號」編譯錯誤。本文分析錯誤原因並給出規範解決方案。
// 錯誤的頭文件 myheader.h
sturct my() // 拼寫錯誤:應為 struct
{
int h;
int hao[20];
my() // 構造函數寫法不當
{
h = 0;
}
} uo; // 直接在頭文件實例化全局對象 uo
sturct 應為 struct。()。uo,導致每個包含該頭文件的編譯單元都產生一個 uo 符號,鏈接時發生重定義。// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
struct MyStruct {
int h;
int hao[20];
MyStruct() : h(0) {} // 正確的構造函數寫法
};
// 聲明外部變量,不定義
extern MyStruct uo;
#endif
// myheader.cpp
#include "myheader.h"
MyStruct uo; // 這裡真正分配內存並定義符號
// main.cpp
#include "myheader.h"
#include <iostream>
int main() {
uo.h = 10;
std::cout << uo.h;
return 0;
}
C++17 起,可在頭文件中使用 inline 關鍵字定義變量,避免重定義:
// myheader.h (C++17)
#ifndef MYHEADER_H
#define MYHEADER_H
struct MyStruct {
int h;
int hao[20];
MyStruct() : h(0) {}
};
inline MyStruct uo; // C++17 inline 變量,多文件包含不重複定義
#endif
extern 變量聲明、inline 變量)。inline。