聲明與定義的區別、extern 連結指定、編譯單元邊界、一次定義規則(ODR)構成 C/C++ 程式模組化的核心契約。本文系統解析變數/函式聲明定義語法、五大聲明非定義場景、extern 作用域延伸、main 函式特殊規則、多檔案專案實戰模式,建立專業級建構模型理解。
| 實體 | 聲明 | 定義 |
|---|---|---|
| 變數 | extern int a; | int a; / int a = 1; |
| 函式 | extern int func(int, int); | int func(int x, int y) { return x+y; } |
// Declare.cpp
extern int i; // 變數聲明
extern float f(float); // 函式聲明(extern 可省略)
float b; // 變數聲明+定義
float f(float a) { // 函式定義
return a + 1.0;
}
int i; // 變數定義
int h(int x) { // 函式聲明+定義
return x + 1;
}
int main() {
b = 1.0; i = 2;
f(b); h(i);
return 0;
}
int func();extern 無初始化:extern int a;int a;(檔案作用域視為暫定定義,C++ 標準較嚴格)static int count;(類別內)class Foo;typedef、using 別名宣告extern 可省略:int func(); 隱含 externint func(int, int); 僅型別必要main() 必須回傳 int:C++ 標準強制,非 void
// a.h - 介面
#pragma once
extern int global_counter;
void increment();
// a.cpp - 實作
#include "a.h"
int global_counter = 0; // 定義(僅此處)
void increment() { ++global_counter; }
// main.cpp - 使用
#include "a.h"
int main() {
increment();
return global_counter;
}
// 編譯:各單元獨立編譯
g++ -c a.cpp -o a.o
g++ -c main.cpp -o main.o
// 連結:合併符號表,檢查 ODR
g++ a.o main.o -o app
「聲明引入名稱,定義分配實體」,extern 延伸跨編譯單元可見性,ODR 守護連結期唯一性。掌握五大聲明非定義場景、main 回傳 int 強制、標頭檔僅聲明/定義入 .cpp 模式,是從單檔練習邁向工程級多模組 C++ 開發的必經門檻。