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.mzph.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;总耗时…