#ifndef SMARTNOSE_2002_6_21_HEADERFILE_H
#define SMARTNOSE_2002_6_21_HEADERFILE_H
int iglobal; // 全局變量定義
#endif
命名建議:包含作者、日期、文件名,確保唯一性並攜帶元信息。
#pragma once
// 整個文件只被編譯一次,VC6+ 支持,編譯器內部實現,效率更高
void AllocMemory() {
#ifdef _WINDOWS_PLATFORM
HeapAlloc(GetProcessHeap(), 0, size); // Windows API
#else
malloc(size); // 標準 C
#endif
}
編譯時定義 _WINDOWS_PLATFORM 宏即可切換實現。
#ifdef _DEBUG
TRACE("調試信息: %d\n", value); // 僅調試版編譯
ASSERT(pointer != NULL);
#endif
| 指令 | 用法 | 作用 |
|---|---|---|
#pragma message | #pragma message("編譯提示: 當前為調試版") | 編譯輸出窗口顯示信息,檢查宏定義狀態 |
#pragma code_seg | #pragma code_seg(".mysection") | 設置函數代碼段,驅動開發常用 |
#pragma once | 文件開頭 | 防止重複包含,替代 #ifndef 守衛 |
#pragma comment | #pragma comment(lib, "mylib.lib") | 鏈接庫、導出符號、設置鏈接器選項 |
#pragma pack | #pragma pack(push, 1) | 控制結構體對齊,網絡協議/文件格式必須 |
#ifdef _X86
#pragma message("_X86 宏已激活,將針對 x86 優化")
#endif
#ifndef UNICODE
#pragma message("警告: 未定義 UNICODE,字符集為 ANSI")
#endif
| 宏 | 展開內容 | 典型用途 |
|---|---|---|
__FILE__ | 當前源文件名 | 錯誤定位、日誌記錄 |
__LINE__ | 當前行號 | 斷言、調試定位 |
__DATE__ | 編譯日期 "Mmm dd yyyy" | 版本信息、構建時間戳 |
__TIME__ | 編譯時間 "hh:mm:ss" | 構建時間戳 |
__TIMESTAMP__ | 文件最後修改時間 | 增量構建判斷 |
__FUNCTION__ | 當前函數名 (C99/C++11) | 日誌上下文 |
_MSC_VER | 編譯器版本 (1900=VS2015) | 版本條件編譯 |
_DEBUG / NDEBUG | 調試/發布標識 | 斷言、調試代碼控制 |
WIN32 / _WIN64 | 平台標識 | 平台相關代碼隔離 |
#define MY_ASSERT(cond) \
if (!(cond)) { \
CString msg; \
msg.Format(_T("斷言失敗: %s\n文件: %s\n行: %d"), _T(#cond), _T(__FILE__), __LINE__); \
AfxMessageBox(msg); \
}
// 使用
MY_ASSERT(pPointer != NULL);
MY_ASSERT(index >= 0 && index < count);
#define STR(x) #x // 字符串化
#define CAT(a, b) a##b // 連接
STR(Hello) // "Hello"
CAT(var, 1) // var1
#define SAFE_FREE(p) \
do { \
if (p) { free(p); (p) = NULL; } \
} while (0)
// 使用時可跟分號,語法安全
SAFE_FREE(ptr);
#define LOG(fmt, ...) \
printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, __VA_ARGS__)
LOG("Value = %d", value); // 自動帶文件行號
預處理指令與宏是 C/C++ 元編程的基石。從防重複包含、條件編譯、編譯期診斷、代碼段控制,到調試輔助、跨平台抽象、領域特定語言構建,靈活運用這些工具能顯著提升代碼可維護性、可移植性與開發效率。建議:優先用 const/inline/constexpr 替代簡單宏,複雜邏輯用模板/函數,宏專注於編譯期控制與元信息提取。