跨文件引用變量/函數需 extern 聲明。有人將 extern 放在函數體內以限制作用域,例如:
void setOldClock() { sysTime = 87654321; }
void setClock() {
extern int sysTime; // 僅在此函數可見
sysTime = 12345678;
}
若聲明在函數外,setOldClock 也會修改該全局變量,通常不期望。
C++ 調用 C 函數/變量需 extern "C" 指定 C 鏈接。但 不能 放在函數體內:
void setClock() {
extern "C" int sysTime; // 編譯錯誤!
sysTime = 12345678;
}
GCC 報錯:
error: expected unqualified-id before string constant error: 'sysTime' was not declared in this scope
原因:編譯器將 "C" 視為字符串常量而非鏈接指示符,導致後續聲明無效。
extern "C" 必須置於命名空間作用域(全局或 namespace 內):
extern "C" int sysTime; // 正確
void setClock() { sysTime = 12345678; }
extern 可在函數內限制作用域,屬良好封裝實踐。extern "C" 絕對不能 出現在函數體內,必須在全局/命名空間作用域。extern "C"。