現存在標頭檔案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沒有巨集...