首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 預處理器內建宏 __LINE__、__FILE__、__FUNCTION__ 詳解

     編輯:程式設計綜合問答

什麼是內建宏?

__LINE__、__FILE__、__FUNCTION__(C++11 為 __func__)是編譯器預先定義的預處理器宏,不需在專案屬性或標頭檔中宣告,編譯器在前處理階段自動替換為對應的編譯時期資訊。

主要內建宏對照表

宏名稱標準展開內容常見用途
__LINE__C/C++當前原始碼行號(整數常數)除錯日誌、斷言訊息
__FILE__C/C++當前編譯檔案完整路徑(字串常值)日誌標記、錯誤定位
__FUNCTION__MSVC/GCC 擴充當前函式名稱(字串常值)追蹤呼叫堆疊、效能分析
__func__C99 / C++11當前函式名稱(區域靜態字元陣列)跨平台標準寫法
__DATE__C/C++編譯日期 "Mmm dd yyyy"版本資訊
__TIME__C/C++編譯時間 "hh:mm:ss"版本資訊
__cplusplusC++C++ 標準版本號(如 201703L)條件編譯
__STDC__C符合 C 標準則為 1條件編譯

實作原理

編譯器前端(Frontend)在詞法分析與前處理階段,維護一個原始碼位置追蹤器。每當讀取一行原始碼,即更新行號計數器;遇到 #include 切換檔案時更新檔案名稱堆疊;進入函式定義時記錄函式名稱。當偵測到這些保留宏識別字時,直接以對應的編譯時期常數取代,不佔用執行期記憶體,也不產生函式呼叫開銷。

使用範例

#include 
#include 

void log(const std::string& msg) {
    std::cout << "[" << __FILE__ << ":" << __LINE__ << "] "
              << __FUNCTION__ << ": " << msg << std::endl;
}

int main() {
    log("程式啟動");
    return 0;
}
// 輸出範例:[main.cpp:12] main: 程式啟動

注意事項

  • 不可取址:宏展開為常值,無法取得位址(&__LINE__ 編譯錯誤)。
  • 非變數:不能修改其值,亦非執行期變數。
  • 跨平台差異:__FUNCTION__ 為編譯器擴充,C++11 標準請用 __func__;MSVC 同時支援兩者。
  • __FILE__ 路徑格式視編譯器而定(MSVC 為絕對路徑,GCC/Clang 為編譯指令給定的相對/絕對路徑)。

總結

內建宏是零成本的編譯時期資訊注入機制,廣泛用於除錯、日誌、斷言、版本標記等場景,善用它們能大幅提升程式碼可維護性與除錯效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved