構建c c 專案時新增巨集定義

2021-07-10 23:15:48 字數 1695 閱讀 2999

有時候我們希望在構建時能夠在命令列新增一些巨集定義,改變程式行為。乙個典型應用示例是**裡通過檢查是否定義了debug巨集,來決定是否輸出除錯資訊。編譯器一般提供命令列選項支援這種做法,例如使用 gcc 時可以在命令列新增-d選項,定義一些巨集:

gcc -ddebug=1 a.c
不過,大型專案一般都需要自動化構建工具,如 gnu autotools 或者 cmake。使用它們後,我們無法直接修改編譯命令,但它們提供了替代方案。對於 autotools,它可以識別cppflags等環境變數,從而我們可以在命令列上新增巨集定義,例如:

cppflags="-ddebug=1" ./configure

此外,我們還可以先export cppflags="-ddebug=1",再用./configure命令。注意這裡cppflags的 cpp 指的是 c 預處理器 (c preprocessor),不是 c++,其中只應該設定-i-d-u等影響預處理器的選項。autotools 支援cflagscxxflagsldflags環境變數,分別用來指定 c 編譯鏈結時、c++ 編譯鏈結時、以及僅在鏈結時有效的選項。

目前許多專案已經使用 cmake 來構建。cmake 支援cflagscxxflagsldflags等,但遺憾的是唯獨不支援cppflags。也就是說,cmake 會無視cppflags環境變數的值。aron xu 為此報了乙個 bug ,不過因為沒人志願去做,所以一直沒有修復。許多人可能會以為,可以用類似cmake .. -dvar=value的方式來新增巨集定義,但這是 無效 的。這樣一來,如果想在命令列上指定巨集定義,只能復用cflags或者cxxflags變數。這基本可以工作,因為一般情況下預處理和編譯是同乙個命令進行的。

cmake 中標準的新增巨集定義方法是使用add_definitions(-dmacro)(參考 文件 ),不過這需要修改cmakelists.txt檔案。如果想要在命令列上定製巨集的開關或取值,那麼可以像 這裡 一樣,定義乙個 cmake 選項:

option(define_macro "option description" on) # enabled by default
然後做乙個條件判斷:

if(define_macro)

add_definitions(-dmacro)

endif(define_macro)

之後,就可以用cmake -ddefine_macro=off ..調整巨集的開關或取值了。

最後值得一提的是,如果**裡已經有了巨集定義語句,那麼通過命令列修改其取值是 不可能 的。編譯器會警告巨集被重複定義,而且生效的是原始檔中的定義。想要重新定義,只能隨後#undef#define。這將不得不通過修改**來實現。

C C 預定義巨集

下面描述的巨集定義,不需引用其他標頭檔案,直接可用於 中。特定的作用給我們提供了不少的便利。分別描述如下 1 file line function 或者 func file 當前程式行所在原始檔名稱,標準c支援,該巨集當做字串對待 line 當前程式行所在原始檔內的行號,標準c支援,該巨集當做整形對...

C C 中巨集定義 define

define是c語言中提供的巨集定義命令,其主要目的是為程式設計師在程式設計時提供一定的方便,並能在一定程度上提高程式的執行效率,但學生在學習時往往不能 理解該命令的本質,總是在此處產生一些困惑,在程式設計時誤用該命令,使得程式的執行與預期的目的不一致,或者在讀別人寫的程式時,把執行結果理解錯誤,這...

使用Bazel構建C C 專案

這是關於bazel的第二篇blog,前一篇寫了安裝 配置相關的東西,這一篇則是4個逐步推進的例子,改編自官方demo 以及相應的概念 文件鏈結等。目錄即使是bazel build官方文件,也不明確區分target和rule字眼,可以認為是乙個意思 大體上,bzl相當於.cmake檔案,build相當...