查看make命令执行后涉及的预编译宏定义的值

要查看 make 命令执行后涉及的预编译宏定义(如 -D 定义的宏)及其值,可以采用以下方法:


1. 查看 Makefile 中的宏定义

  • 直接检查 Makefile 或相关构建脚本(如 configureCMakeLists.txt),寻找 -D 开头的编译选项。例如:
    CFLAGS += -DDEBUG -DLEVEL=3
    
    这里的 -DDEBUG-DLEVEL=3 就是预定义的宏。

2. 通过编译命令提取宏

  • 手动运行编译命令
    执行 make 时添加 -n--dry-run 选项,打印实际执行的编译命令但不运行:

    make -n
    

    在输出中查找 gcc/clang 等编译器的调用,检查 -D 定义的宏(如 -DFOO=bar)。

  • 直接捕获编译命令
    使用 make VERBOSE=1(某些项目支持)或修改 Makefile 显式打印命令:

    CFLAGS += -v  # 输出详细编译信息(GCC)
    

3. 通过预处理器输出宏值

  • 方法 1:使用 -E-dM 选项
    修改 Makefile,在编译命令中添加 -E -dM,将宏定义输出到文件:

    CFLAGS += -E -dM -o macros.txt
    

    然后运行 make,生成的 macros.txt 会包含所有预定义的宏。

  • 方法 2:临时修改源文件
    在代码中插入以下代码,编译时打印宏值:

    #ifdef FOO
    #pragma message "FOO is defined with value: " #FOO
    #else
    #pragma message "FOO is undefined"
    #endif
    

    GCC 会输出类似 note: #pragma message: FOO is defined with value: 42 的信息。


4. 使用专用工具

  • GCC/Clang 的 -M 系列选项
    生成依赖关系时附带宏定义(较少直接使用):

    gcc -M -DDEBUG main.c
    
  • CMake 项目
    如果项目使用 CMake,通过 compile_definitionsadd_definitions 设置的宏可在 CMakeLists.txt 中查找,或生成编译数据库:

    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
    

    生成的 compile_commands.json 文件会包含每个源文件的编译命令及宏定义。


5. 运行时检测(条件编译)

如果宏影响代码逻辑,可以通过条件编译在运行时输出信息:

#include <stdio.h>int main() {#ifdef MY_MACROprintf("MY_MACRO is defined as: %d\n", MY_MACRO);#elseprintf("MY_MACRO is undefined\n");#endifreturn 0;
}

总结步骤:

  1. 检查 Makefile:搜索 -D 开头的选项。
  2. 查看实际编译命令make -nVERBOSE=1
  3. 预处理输出宏:通过 -E -dM 生成宏列表。
  4. 代码或工具辅助:使用 #pragma message 或 CMake 的编译数据库。

根据项目复杂度选择合适的方法,通常结合 make -n 和预处理输出是最直接的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】面试常考题目

面试中最常考的数据结构与算法题&#xff0c;适合作为刷题的第一阶段重点。 ✅ 分类 & 推荐题目列表&#xff08;精选 70 道核心题&#xff09; 一、数组 & 字符串&#xff08;共 15 题&#xff09; 题目类型LeetCode编号两数之和哈希表#1盛最多水的容器双指针#11三数…

【芯片学习】555

一、引脚作用 二、原理图 三、等效原理图 1.比较器 同相输入端大于反相输入端&#xff0c;输出高电平&#xff0c;反之亦然 2.三极管 给它输入高电平就可以导通 3.模拟电路部分 4.数字电路部分 这部分的核心是RS触发器&#xff0c;R-reset代表0&#xff0c;set是置位代表1&am…

Linux《文件系统》

在之前的系统IO当中已经了解了“内存”级别的文件操作&#xff0c;了解了文件描述符、重定向、缓冲区等概念&#xff0c;在了解了这些的知识之后还封装出了我们自己的libc库。接下来在本篇当中将会将视角从内存转向磁盘&#xff0c;研究文件在内存当中是如何进行存储的&#xf…

Java-代码段-http接口调用自身服务中的其他http接口(mock)-并建立socket连接发送和接收报文实例

最新版本更新 https://code.jiangjiesheng.cn/article/367?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. controller入口 ApiOperation("模拟平台端现场机socket交互过程,需要Authorization")PostMapping(path "/testS…

基于递归思想的系统架构图自动化生成实践

文章目录 一、核心思想解析二、关键技术实现1. 动态布局算法2. 样式规范集成3. MCP服务封装三、典型应用场景四、最佳实践建议五、扩展方向一、核心思想解析 本系统通过递归算法实现了Markdown层级结构到PPTX架构图的自动转换,其核心设计思想包含两个维度: 数据结构递归:将…

Python包管理器 uv替代conda?

有人问&#xff1a;python的包管理器uv可以替代conda吗? 搞数据和算法的把conda当宝贝&#xff0c;其他的场景能替代。 Python的包管理器有很多&#xff0c;pip是原配&#xff0c;uv是后起之秀&#xff0c;conda则主打数据科学。 uv替代pip似乎只是时间问题了&#xff0c;它…

使用pnpm、vite搭建Phaserjs的开发环境

首先&#xff0c;确保你已经安装了 Node.js 和 npm。然后按照以下步骤操作&#xff1a; 一、使用pnpm初始化一个新的 Vite 项目 pnpm create vite 输入名字 选择模板&#xff0c;这里我选择Vanilla,也可以选择其他的比如vue 选择语言 项目新建完成 二、安装相关依赖 进入项…

JS逆向案例—喜马拉雅xm-sign详情页爬取

JS逆向案例——喜马拉雅xm-sign详情页爬取 声明网站流程分析总结 声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&am…

姜老师的MBTI课程:MBTI是可以转变的

我们先来看内向和外向这条轴&#xff0c;I和E内向和外向受先天遗传因素的影响还是比较大的&#xff0c;因为它事关到了你的硬件&#xff0c;也就是大脑的模型。但是我们在大五人格的排雷避坑和这套课程里面都强调了一个观点&#xff0c;内向和外向各有优势&#xff0c;也各有不…

进程同步:生产者-消费者 题目

正确答案&#xff1a; 问题类型&#xff1a; 经典生产者 - 消费者问题 同时涉及同步和互斥。 同步&#xff1a;生产者与消费者通过信号量协调生产 / 消费节奏&#xff08;如缓冲区满时生产者等待&#xff0c;空时消费者等待&#xff09;。互斥&#xff1a;对共享缓冲区的访问需…

吴恩达MCP课程(1):chat_bot

原课程代码是用Anthropic写的&#xff0c;下面代码是用OpenAI改写的&#xff0c;模型则用阿里巴巴的模型做测试 .env 文件为&#xff1a; OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OPENAI_API_BASEhttps://dashscope.aliyuncs.com/compatible-mode…

Netty 实战篇:手写一个轻量级 RPC 框架原型

本文将基于前文实现的编解码与心跳机制&#xff0c;构建一个简单的 RPC 框架&#xff0c;包括请求封装、响应解析、动态代理调用。为打造微服务通信基础打下基础。 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;允许…

边缘计算新基建:iVX 轻量生成模块的 ARM 架构突围

一、引言 随着工业 4.0 和物联网的快速发展&#xff0c;边缘计算作为连接云端与终端设备的关键技术&#xff0c;正成为推动数字化转型的核心力量。在边缘计算场景中&#xff0c;设备的实时性、低功耗和离线处理能力至关重要。ARM 架构凭借其低功耗、高能效的特点&#xff0c;成…

C# 基于 Windows 系统与 Visual Studio 2017 的 Messenger 消息传递机制详解:发布-订阅模式实现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

js数据类型有哪些?它们有什么区别?

js数据类型共有8种,分别是undefined,null,boolean,number,string,Object,symbol,bigint symbol和bigint是es6中提出来的数据类型 symbol创建后独一无二不可变的数据类型,它主要是为了解决出现全局变量冲突的问题 bigint 是一种数字类型的数据,它可以表示任意精度格式的整数,…

Vite打包优化实践:从分包到性能提升

前言: ​​​​​​​ 随着前端应用功能的增加&#xff0c;项目的打包体积也会不断膨胀&#xff0c;影响加载速度和用户体验。本文介绍了几种常见的打包优化策略&#xff0c;通过Vite和相关插件&#xff0c;帮助减少项目体积、提升性能&#xff0c;优化加载速度。 rollup-plugi…

C++语法系列之模板进阶

前言 本次会介绍一下非类型模板参数、模板的特化(特例化)和模板的可变参数&#xff0c;不是最开始学的模板 一、非类型模板参数 字面意思,比如&#xff1a; template<size_t N 10> 或者 template<class T,size_t N 10>比如&#xff1a;静态栈就可以用到&#…

html5的响应式布局的方法示例详解

以下是HTML5实现响应式布局的5种核心方法及代码示例: 1. 媒体查询(核心方案) /* 默认样式(移动优先) */ .container {padding: 15px; }/* 中等屏幕(平板) */ @media (min-width: 768px) {.container {padding: 30px;max-width: 720px;} }/* 大屏幕(桌面) */ @media …

数字化转型进阶:精读41页华为数字化转型实践【附全文阅读】

该文档聚焦华为数字化转型实践&#xff0c;核心内容如下&#xff1a; 转型本质与目标&#xff1a;数字化转型是通过数字技术穿透业务&#xff0c;实现物理世界与数字世界的融合&#xff0c;目标是支撑主业成功、提升体验与效率、探索模式创新。华为以 “平台 服务” 为核心&am…

C++ - STL #什么是STL #STL的版本 #闭源开源 #STL的六大组件

文章目录 前言 一、什么是STL 二、STL的版本 1、原始版本 2、P.J.版本 3、RW版本 4、SGI版本 三、闭源、开源 四、STL的六大组件 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索&#xff1b; 一、什么是STL STL(standard template libaray 标准模板库)&#…