GCC 預定義宏:解鎖編譯器的隱藏信息

GCC 預定義宏:解鎖編譯器的隱藏信息

在 GCC 編譯器中,有許多內置的預定義宏,它們可以提供編譯環境的信息,如文件名、行號、時間、版本等。這些宏在調試、日志記錄、條件編譯等場景中非常有用。本文將介紹常見的 GCC 預定義宏,并提供示例代碼及其輸出結果。

1. 文件與函數信息宏

這些宏提供了代碼的文件名、行號、函數名等信息,常用于日志記錄和調試。

1.1 __FILE__ - 獲取當前源文件名

表示當前源文件的名稱(字符串)。

示例:

#include <stdio.h>int main() {printf("File: %s\n", __FILE__);return 0;
}

可能的輸出:

File: main.c

1.2 __LINE__ - 獲取當前行號

表示當前代碼的行號(整數)。

示例:

#include <stdio.h>int main() {printf("Line: %d\n", __LINE__);return 0;
}

可能的輸出:

Line: 4

(實際行號取決于代碼所在位置)


1.3 __FUNCTION__ / __func__ - 獲取當前函數名

在 C99 及更高版本中,__FUNCTION____func__ 都可以獲取當前函數的名稱,__func__ 是更標準的寫法。

示例:

#include <stdio.h>void test() {printf("Function: %s\n", __func__);
}int main() {test();return 0;
}

可能的輸出:

Function: test

2. 編譯時間信息宏

這些宏提供編譯時的日期和時間,常用于生成版本信息或調試日志。

2.1 __DATE__ - 獲取編譯日期

格式:"Mmm dd yyyy",如 "Mar 21 2025"

示例:

#include <stdio.h>int main() {printf("Compiled on: %s\n", __DATE__);return 0;
}

可能的輸出:

Compiled on: Mar 21 2025

2.2 __TIME__ - 獲取編譯時間

格式:"hh:mm:ss",如 "21:30:00"

示例:

#include <stdio.h>int main() {printf("Compiled at: %s\n", __TIME__);return 0;
}

可能的輸出:

Compiled at: 21:30:00

3. 條件編譯相關宏

這些宏可用于檢查編譯器的特性、語言標準和目標平臺,以實現兼容性處理。

3.1 __STDC__ - 判斷是否為標準 C 編譯器

如果編譯器遵循 ANSI C 標準,則此宏定義為 1

示例:

#ifdef __STDC__printf("This is an ANSI C compiler\n");
#endif

3.2 __STDC_VERSION__ - 檢查 C 語言標準版本

表示 C 語言標準的版本號,例如:

  • 199409L (C90)
  • 199901L (C99)
  • 201112L (C11)
  • 201710L (C17)

示例:

#if __STDC_VERSION__ >= 201112Lprintf("C11 or later is supported\n");
#endif

3.3 __cplusplus - 檢查是否為 C++ 編譯

如果使用 C++ 編譯器,該宏會被定義,且值表示 C++ 標準的版本號,如:

  • 199711L (C++98)
  • 201103L (C++11)
  • 201402L (C++14)
  • 201703L (C++17)

示例:

#ifdef __cplusplusprintf("This is a C++ compiler\n");
#endif

4. 編譯器與平臺信息宏

4.1 __GNUC__ - 檢查是否使用 GCC 編譯器

如果使用 GCC 編譯器,則此宏被定義,其值為 GCC 主版本號。

示例:

#ifdef __GNUC__printf("Compiled with GCC %d\n", __GNUC__);
#endif

可能的輸出(GCC 13.1 編譯時):

Compiled with GCC 13

4.2 __linux__ - 檢查是否在 Linux 上運行

如果目標系統是 Linux,則此宏被定義。

示例:

#ifdef __linux__printf("Running on Linux\n");
#endif

4.3 __x86_64__ - 檢查是否是 64 位架構

如果目標架構是 64 位 x86,則此宏被定義。

示例:

#ifdef __x86_64__printf("64-bit architecture\n");
#endif

5. 其他實用宏

5.1 __COUNTER__ - 遞增的唯一標識符

此宏從 0 開始,每次使用時加 1,常用于生成唯一變量名。

示例:

#include <stdio.h>#define UNIQUE_NAME(x) x##__COUNTER__int UNIQUE_NAME(var) = 10;
int UNIQUE_NAME(var) = 20;int main() {printf("Unique variables defined.\n");return 0;
}

編譯后變量名可能變為 var0var1,避免了名稱沖突。


5.2 __BASE_FILE__ - 獲取主編譯文件

如果某個文件是通過 #include 包含進來的,而不是直接編譯的源文件,那么 __FILE__ 會顯示該文件名,而 __BASE_FILE__ 會顯示實際的主編譯文件。

示例:

printf("Base file: %s\n", __BASE_FILE__);

6. 綜合示例:獲取編譯信息

#include <stdio.h>int main() {printf("File: %s\n", __FILE__);printf("Line: %d\n", __LINE__);printf("Compiled on: %s at %s\n", __DATE__, __TIME__);#ifdef __GNUC__printf("GCC version: %d.%d\n", __GNUC__, __GNUC_MINOR__);#endifreturn 0;
}

可能的輸出:

File: main.c
Line: 5
Compiled on: Mar 21 2025 at 21:30:00
GCC version: 13.1

7. 結論

這些 GCC 預定義宏在調試、日志、條件編譯等場景中非常實用。建議在編寫可移植代碼時,合理利用這些宏來增強代碼的靈活性和可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74050.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

公鏈開發費用及其構成內容詳析

在區塊鏈技術迅速發展的今天&#xff0c;公鏈&#xff08;Public Blockchain&#xff09;作為去中心化、不可篡改、高安全性的重要應用之一&#xff0c;在金融、供應鏈、游戲等多個領域得到了廣泛應用。然而&#xff0c;開發一條公鏈并非易事&#xff0c;它不僅需要高度專業技能…

Java求101-200之間有多少素數

Java學習筆記 今天看教程看到了這個題&#xff0c;對于一名打過算法競賽的選手還是很簡單的&#xff0c;但由于之前是c組的&#xff0c;所以用java寫一下&#xff0c;練一下手。 代碼&#xff1a; package com.itheima.hello;public class Test1 {public static void main(S…

DM 達夢上的日志挖掘 DBMS_LOGMNR

適用場景 在 DM 中&#xff0c;用戶可以使用 DBMS_LOGMNR 包對歸檔日志進行挖掘&#xff0c;重構出 DDL 和 DML 等操作&#xff0c;并通過獲取的信息進行更深入的分析&#xff1b;同樣&#xff0c;可以對歸檔日志文件進行恢復被誤操作的數據&#xff0c;并進行故障跟蹤&#x…

JavaWeb之WebSocket

目錄 一、 websocket 概念二、WebSocket原理三、WebSocket特點四、WebSocket應用場景五、Websocket基本使用1、創建Websocket對象2、Websocket事件3、Websocket方法4、前端服務程序 六、聊天室案例1、Tomcat版本&#xff1a;8.0.442、Maven 依賴&#xff1a;3、前端代碼4、后端…

Unity Shader編程】之透明物體渲染

以下是針對您提出的關于 Unity Shader 渲染 Pass 的查看方法、多個 Pass 的影響、Pass 的含義&#xff0c;以及 Unity 渲染物體的流程和處理多個透明/半透明/不透明物體的詳細解答。 1. Unity Shader 渲染 Pass 的查看方法 查看 Pass 的方法 通過 Shader 代碼&#xff1a; 打開…

字符指針的三道例題+算法改進

目錄 一.楊氏矩陣 1.初級 2.想把下標帶回來 二.字符串左旋 算法改進 三.判斷是否為字符串旋轉結果 算法改進 四. 3個字符函數 1.strcat 2.strncat 3.strstr 一.楊氏矩陣 數字矩陣&#xff0c;每行從左到右遞增&#xff0c;每列從上到下遞增&#xff0c;編寫程序在矩…

VSCode中搜索插件顯示“提取擴展時出錯。Failed to fetch”問題解決!

大致的問題如下&#xff0c;在VSCode的插件商店搜索插件時提示如下&#xff1a; 導致的情況有以下幾點&#xff1a; 1、代理問題&#xff0c;如果是代理引起的&#xff0c;可以繼續使用代理后也能搜索和安裝插件。 2、還有可能是你的所連接的網絡設置了防火墻&#xff0c;比較…

雙指針(2)—三數之和

文章目錄 題目解析解法&#xff08;排序雙指針&#xff09;&#xff1a;哈希解法附加Java代碼&#xff1a; 力扣題目&#xff1a;三數之和 題目解析 解法&#xff08;排序雙指針&#xff09;&#xff1a; **算法思路&#xff1a;** 本題與兩數之和類似&#xff0c;是?常經典的…

設計一套水產養殖系統

設計一套水產養殖系統 引言 水產養殖在全球糧食安全和經濟發展中日益重要。它不僅為不斷增長的人口提供了重要的蛋白質來源&#xff0c;還在許多地區創造了就業機會并促進了經濟增長 。全球超過一半的人類消費的海產品來自水產養殖&#xff0c;并且這一比例預計將繼續上升 。…

統計可重復列表中的TOP N

文章目錄 方案1&#xff1a;HashMap統計 全排序實現步驟&#xff1a;代碼實現&#xff1a;優缺點&#xff1a; 方案2&#xff1a;HashMap統計 最小堆&#xff08;優先隊列&#xff09;實現步驟&#xff1a;代碼實現&#xff1a;優缺點&#xff1a; 方案3&#xff1a;Java Str…

JVM 知識點梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java開發工具包 JRE 開發命令工具&#xff08;運行java.exe、編譯javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java運行環境 JVM Java核心類庫&#xff08;l…

淘寶歷史價格數據獲取指南:API 與爬蟲方案的合法性與效率對比

引言 在淘寶平臺的購物生態中&#xff0c;消費者希望通過了解商品歷史價格來判斷當前價格是否實惠&#xff0c;商家也需要借助歷史價格數據制定合理的營銷策略、分析市場趨勢。獲取淘寶商品歷史價格數據主要有 API 和爬蟲兩種方案&#xff0c;它們在合法性與效率上存在顯著差異…

DeepSeek-R1論文深度解析:純強化學習如何引爆LLM推理革命?

技術突破&#xff1a;從“無監督”到“自主進化”的跨越 paper &#xff1a;https://arxiv.org/pdf/2501.12948目錄 技術突破&#xff1a;從“無監督”到“自主進化”的跨越1 DeepSeek-R1-Zero&#xff1a; RLnoSFT1.1 R1-Zero&#xff1a; GRPO&#xff08;Group Relative Po…

表格標題豎直

使用文本方式使表格怎么豎列 思路&#xff1a;表格豎直書寫&#xff0c;里面的內容水平書寫 使用到的是css中的文本效果&#xff1a; writing-mode&#xff1a;書寫方式horizontal-tb&#xff1a;水平vertical-rl&#xff1a;豎直<style>table {writing-mode: vertical…

AI+視頻賦能智慧農業:EasyCVR打造全域可視化農場監管平臺

隨著科技的飛速發展&#xff0c;傳統農業正加速向智慧農業轉型&#xff0c;農場管理也迎來了前所未有的變革機遇。在這一進程中&#xff0c;如何有效整合先進的信息技術&#xff0c;實現農場的精準化、智能化管理&#xff0c;成為了擺在農場主和農業管理者面前的關鍵課題。 基于…

HarmonyOS鴻蒙開發 BuilderParam在父組件的Builder的點擊事件報錯:Error message:is not callable

HarmonyOS鴻蒙開發 BuilderParam在父組件的Builder的點擊事件報錯&#xff1a;Error message:is not callable 最近在鴻蒙開發過程中&#xff0c;UI做好了&#xff0c;根據列表item進行點擊跳轉&#xff0c;報錯了 報錯信息如下 Error message:is not callable Stacktrace:at…

簡化神經元模型6 -- Hindmarsh-Rose Model

Hindmarsh-Rose 模型 目錄 0. 寫在前面 1. Hindmarsh-Rose 模型的定義 2. Hindmarsh-Rose 模型簇發放的動力學機制 3. Hindmarsh-Rose 模型的其他發放模式 4. 分析過程所用到的一系列 BrainPy 代碼 0. 寫在前面 前面介紹了: Hodgkin-Huxley Model 簡化神經元模型1 – LIF M…

第六屆電氣、電子信息與通信工程國際學術會議 (EEICE 2025)

重要信息 官網&#xff1a;www.eeice.net&#xff08;點擊了解參會投稿等&#xff09; 時間&#xff1a;2025年4月18-20日 地點&#xff1a;中國-深圳技術大學 簡介 第六屆電氣、電子信息與通信工程 (EEICE 2025&#xff09;將于2025年4月18-20日在中國深圳召開。 EEICE 20…

計算機操作系統(三) 操作系統的特性、運行環境與核心功能(附帶圖譜更好對比理解))

計算機操作系統&#xff08;三&#xff09; 操作系統的特性、運行環境與核心功能 前言一、操作系統的基本特性1.1 并發1.2 共享1.3 虛擬1.4 異步 二、操作系統的運行環境2.1 硬件支持2.2 操作系統內核2.3 處理機的雙重工作模式2.4 中斷與異常 三、操作系統的主要功能3.1 處理機…

Linux(Ubuntu)系統安裝Docker與Docker Compose完整指南

本文是為需要在Ubuntu系統部署容器服務的開發者準備的詳細教程。我們將分兩個主要部分講解&#xff1a;Docker引擎的標準安裝流程和Docker Compose的配置方法。所有操作均在終端執行&#xff0c;建議使用Ubuntu 18.04及以上版本。 一、Docker引擎安裝全流程 &#xff08;總耗時…