查看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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85281.shtml
英文地址,請注明出處:http://en.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 標準模板庫)&#…