在 changshu.h 直接定義全域變數:
// changshu.h
int g_count = 0; // 定義
double g_rate = 1.5;
多個 .cpp 包含此標頭檔,連結時出現 already defined in main.obj 錯誤。
標頭檔被多個編譯單元包含,每個 .cpp 都會產生一份定義,連結器發現多重定義。
// changshu.h
#ifndef CHANGSHU_H
#define CHANGSHU_H
extern int g_count; // 宣告
extern double g_rate; // 宣告
#endif
// changshu.cpp
#include "changshu.h"
int g_count = 0; // 定義(配置記憶體)
double g_rate = 1.5; // 定義
// other.cpp
#include "changshu.h"
void foo() {
g_count++; // 正常使用
}
#ifndef CHANGSHU_H / #define CHANGSHU_H / #endif 確保同一編譯單元內僅處理一次標頭檔內容,但**不解決多重定義問題**——定義仍須放在單一 .cpp。
若專案支援 C++17,可直接在標頭檔定義:
// changshu.h
inline int g_count = 0;
inline double g_rate = 1.5;
inline 指示連結器合併多重定義,適用於純標頭檔庫或簡化專案結構。
static 在標頭檔定義:每個編譯單元會有獨立副本,**非共享全域變數**。.cpp 重複編譯,跨 .cpp 仍各產生一份定義。遵循「標頭檔宣告 extern,單一 .cpp 定義」原則,即可消除連結錯誤。