headerfile.h 定義全域變數 int iglobal;,被 headerfile1.h 與 headerfile2.h 同時包含,implement.cpp 再包含這兩個檔案 → 編譯器重複編譯 headerfile.h → 變數重複定義錯誤。
#ifndef SMARTNOSE_2002_06_21_HEADERFILE_H
#define SMARTNOSE_2002_06_21_HEADERFILE_H
int iglobal;
#endif
命名建議:包含作者、檔名、建立時間等資訊,避免衝突並具備文檔價值。
#pragma once
int iglobal;
同一原始碼支援 Windows/Linux 不同 API:
void AllocateMemory() {
#ifdef _WINDOWS_PLATFORM
HeapAlloc(GetProcessHeap(), 0, 1024); // Windows API
#else
malloc(1024); // 標準 C
#endif
}
編譯時定義 _WINDOWS_PLATFORM 即可切換實作。MFC 專案常見 #ifdef _DEBUG 區隔除錯程式碼。
#pragma message("正在編譯模組: " __FILE__)
編譯輸出視窗顯示自訂訊息,適用:
#ifdef _X86 #pragma message("_X86 已啟用") #endif#pragma message("TODO: 優化演算法")#pragma code_seg("MY_SECTION")
void MyFunction() { ... }
#pragma code_seg()
指定函數編譯至特定程式碼區段,驅動程式開發常用。
#pragma comment(lib, "ws2_32.lib") // 自動連結 Winsock 庫
#pragma comment(linker, "/subsystem:windows /entry:WinMainCRTStartup")
| 巨集 | 用途 | 範例輸出 |
|---|---|---|
__FILE__ | 目前編譯檔案名稱 | "test.cpp" |
__LINE__ | 目前行號 | 42 |
__DATE__ | 編譯日期 | "Jan 15 2024" |
__TIME__ | 編譯時間 | "14:30:00" |
__TIMESTAMP__ | 檔案修改時間 | "Mon Jan 15 14:30:00 2024" |
__FUNCTION__ | 目前函數名稱 (C99/C++11) | "MyFunction" |
_MSC_VER | MSVC 版本號 | 1930 (VS 2022) |
_WIN32 / _WIN64 | 平台偵測 | 1 |
_DEBUG / NDEBUG | 建置模式 | 1 / 0 |
#define MyAssert(x) \
if (!(x)) \
MessageBox(NULL, __FILE__, __LINE__, MB_OK);
無法使用 MFC ASSERT 的專案 (如主控台程式、DLL) 可用此替代,彈出對話框顯示錯誤檔案與行號。
#define SQR(x) ((x)*(x)) 避免運算子優先級問題#define MACRO() do { ... } while(0) 確保語句行為翻閱 MFC、Linux 核心原始碼,巨集佔據半壁江山:訊息對應、佇列操作、平台移植、版本管理、核心模組載入卸載。精通巨集是掌握 C/C++ 進階開發的關鍵鑰匙。