C++ 類別定義結尾必須加上分號。遺漏分號不會直接報錯於類別定義處,而是導致後續包含該頭文件的原始碼產生莫名其妙的語法錯誤,極難追蹤。
Test.h (錯誤版)
class Test {
public:
virtual void test1();
} // ← 缺少分號!
Test.cpp
#include "Test.h"
#include <iostream>
using namespace std;
void Test::test1() { cout << "Hello" << endl; }
編譯錯誤 (VC6)
c:\...\include\errno.h(29) : error C2143: syntax error : missing ';' before 'string'
c:\...\include\errno.h(29) : fatal error C1004: unexpected end of file found
錯誤指向系統頭文件 errno.h,而非真正錯誤位置!
#include "Test.h" 將內容直接展開到 Test.cpp。缺少分號導致編譯器將後續的 #include <iostream> 內容視為類別定義的一部分,進而污染標準庫頭文件解析。
class Test {
public:
virtual void test1();
}; // ← 必須有分號
| 後續程式碼 | 典型錯誤訊息 |
|---|---|
void Test::test1() {} | error C2628: 'Test' followed by 'void' is illegal |
int x; | error C2143: missing ';' before 'int' |
#include <vector> | 標準庫頭文件內部報錯 |
/W4 (MSVC) 或 -Wall -Wextra (GCC/Clang)struct Point { int x, y; }; // 需分號
union Data { int i; float f; }; // 需分號
enum Color { Red, Green, Blue }; // 需分號 (C++11 起可省略,但建議保留)