C語言巨集衝突

2021-08-27 05:44:52 字數 1629 閱讀 2135

現存在標頭檔案mylog.h和原始檔myprog.cpp,內容如下:

mylog.h:

#ifndef my_log_h_

#define my_log_h_

#define log(level,fmt,...) \

mylog(level, fmt, ##__va_args__);

#endif

myprog.cpp:

#include "mylog.h"

#include "json/json.h"

int main()

在預編譯時會出現如下錯誤:

# g++  -g -wall -wshadow -djson_is_amalgamation -i your include path -i./ -e myprog.cpp -o myprog.i

# in file included from /usr/include/math.h:65,

from /usr/include/c++/3.2

.2/cmath:51,

from /usr/include/c++/3.2

.2/bits/locale_facets.tcc:41,

from /usr/include/c++/3.2

.2/locale:46,

from /usr/include/c++/3.2

.2/bits/ostream.tcc:37,

from /usr/include/c++/3.2

.2/ostream:275,

from /usr/include/c++/3.2

.2/iostream:45,

from /your include path/json/json.h:1448,

from myprog.cpp:2:

/usr/include/bits/mathcalls.h:110:35: macro "log" requires 3 arguments, but only 1 given

開啟/usr/include/bits/mathcalls.h檔案,在110行我們可以看到如下內容:

/* natural logarithm of x.  */

__mathcall (log,, (_mdouble_ __x));

該行**定義了對數函式的巨集,該巨集名稱為log,引數數量為1;而在我們定義的標頭檔案mylog.h中,同樣定義了log巨集,引數數量為3;所以,兩個檔案的log巨集定義產生了衝突,才會發生以上問題。

在」myprog.cpp」中,包含」json/json.h」標頭檔案前,先釋放log巨集的定義,包含」json/json.h」標頭檔案後,再覆蓋log巨集的定義。**如下:

#include "mylog.h"

#ifdef log

#undef log

#include "json/json.h"

#define log(level,fmt,...) \

mylog(level, fmt, ##__va_args__);

int main()

C語言巨集技巧 X巨集

本文介紹下x巨集的使用 首先簡單介紹下巨集的幾種用法 define strcat x,y x y define str x x define str x x define log x y 拼接xy x 單引號包裹 x x 字串化,雙引號包裹 x va args 會擴充套件引數.ansi c標準中有幾...

C語言巨集定義

c語言有很多預處理命令,如包含命令 include,巨集定義命令 define。預處理命令在程式編譯之前被編譯器處理,而巨集定義也在此時被替換。或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集...

C語言巨集定義

乙個巨集定義的作用域是從定義處到 undef處或檔案結尾。undef num 現在此處num沒有定義。1.ifdef num 如果num有巨集定義就編譯此處。else 如果num沒有巨集定義就編譯此處 endif 不論num 有沒有巨集都編譯,即判斷體已結束。ifndef num 如果num沒有巨集...