我想寫的東西是這樣的:的#ifdef
#define COV_ON(x) \
#ifdef COVERAGE_TOOL \
_Pragma (COVERAGE #x)
#endif
有什麼辦法來定義COV_ON
這樣嗎?我知道我在上面做的是錯誤的,因爲我在#define中不能有#ifdef
。 (#
不是#define
中的允許字符)。 那麼有什麼解決辦法嗎?
我想寫的東西是這樣的:的#ifdef
#define COV_ON(x) \
#ifdef COVERAGE_TOOL \
_Pragma (COVERAGE #x)
#endif
有什麼辦法來定義COV_ON
這樣嗎?我知道我在上面做的是錯誤的,因爲我在#define中不能有#ifdef
。 (#
不是#define
中的允許字符)。 那麼有什麼解決辦法嗎?
不可能的。反過來:
#ifdef COVERAGE_TOOL
#define COV_ON(x) _Pragma (COVERAGE #x)
#else
#define COV_ON(x)
#endif
簡單地將其翻過來:
#ifdef COVERAGE_TOOL
#define COV_ON(x) _Pragma (COVERAGE #x)
#else
#define COV_ON(x) /* foo */
#endif
#ifdef COVERAGE_TOOL
#define COV_ON(x) _Pragma (COVERAGE #x)
#else
#define COV_ON(x)
#endif
你不能。但是你可以換#ifdef
和#define
:
#ifdef COVERAGE_TOOL
# define COV_ON(x) _Pragma (COVERAGE #x)
#else
# define COV_ON(x)
#endif
感謝您的回覆。我嘗試了COV_ON(on)和COV_ON(off),但後來出現錯誤,說錯誤:預計')',接近關閉。對這個問題有任何想法。 – 2011-04-07 20:40:16
不知道你的編譯器,我們需要知道預期的'_Pragma'語法是什麼;你如何在沒有宏觀的情況下做到這一點? – 2011-04-07 20:55:53
我使用VC2005編譯器,並在線看到_Pragma語法。我從來沒有以這種方式使用過#pragma。 – 2011-04-07 21:06:23
正如你所說,在#define中不可能有#ifdef。你應該做的是相反的順序:
#ifdef COVERAGE_TOOL \
#define COV_ON(x) \
etc.
#endif
這是一個古老的問題,但它需要一個最新的答案。
而不是使用宏內內嵌的ifdef,你可以選擇性地定義一個__VA_ARGS__
宏做同樣的事情
#ifdef COVERAGE_TOOL
#define IF_COVERAGE_TOOL(...) __VA_ARGS__
#else
#define IF_COVERAGE_TOOL(...)
#endif
#define COV_ON(x) IF_COVERAGE_TOOL(_Pragma (COVERAGE #x))
此功能類似於一個ifdef的不同之處在於你得到括號劃定的開頭和結尾(大多數IDE沒有代碼摺疊問題)雖然在上下文中仍然可以使用#define
和#ifdef
,但不允許使用#include
。爲了得到類似#else
內嵌功能,您可以定義一個相應的宏是這樣的:
//#define FOO
#ifdef FOO
#define IF_FOO(...) __VA_ARGS__
#define NO_FOO(...)
#else
#define IF_FOO(...)
#define NO_FOO(...) __VA_ARGS__
#endif
IF_FOO(
#define BAR 5
int foo = BAR;
)
NO_FOO(
#define foo 5
)
只有NO_FOO()/IF_FOO
一個會產生代碼。
好的,這是一個方便的黑客攻擊,但我們可以讓它更多有用比#ifdefs
...布爾邏輯和配置也許?讓我們設置一些真值表(和一對幫助宏)。
#define PASTE_(x,y) x##y
#define PASTE(x,y) PASTE_(x,y)
#define PASTE3_(x,y,z) x##y##z
#define PASTE3(x,y,z) PASTE3_(x,y,z)
#define Y(...) __VA_ARGS__
#define N(...)
#define IF(x) x //alternate method similar to IFNOT()
#define NOT_N Y
#define NOT_Y N
#define IF_NOT(x) PASTE(NOT_,x)
#define NOT(x) PASTE(NOT_,x)
#define N_OR_N N
#define N_OR_Y Y
#define Y_OR_N Y
#define Y_OR_Y Y
#define OR(x,y) PASTE3(x,_OR_,y)
#define N_AND_N N
#define N_AND_Y N
#define Y_AND_N N
#define Y_AND_Y Y
#define AND(x,y) PASTE3(x,_AND_,y)
#define N_XOR_N N
#define N_XOR_Y Y
#define Y_XOR_N Y
#define Y_XOR_Y N
#define XOR(x,y) PASTE3(x,_XOR_,y)
#define N_NOR_N Y
#define N_NOR_Y N
#define Y_NOR_N N
#define Y_NOR_Y N
#define NOR(x,y) PASTE3(x,_NOR_,y)
#define N_NAND_N Y
#define N_NAND_Y Y
#define Y_NAND_N Y
#define Y_NAND_Y N
#define NAND(x,y) PASTE3(x,_NAND_,y)
#define N_XNOR_N Y
#define N_XNOR_Y N
#define Y_XNOR_N N
#define Y_XNOR_Y Y
#define XNOR(x,y) PASTE3(x,_XNOR_,y)
#define IF2(x,y,z) PASTE3(x,y,z)
的config.h
#define FOO Y
#define BAR N
#define BAZ Y
code.c
AND(FOO,BAR)(/*do stuff if both FOO and BAR are enabled*/)
IF2(FOO,_AND_,BAR)(/*do stuff if both FOO and BAR are enabled*/)
OR(BAZ,AND(FOO,BAR))(
/*do stuff if both FOO and BAR are enabled or BAZ is enabled*/
)
感謝您的答覆。我嘗試了COV_ON(on)和COV_ON(off),但後來出現錯誤,說錯誤:預計')',接近關閉。對這個問題有任何想法。 – 2011-04-07 20:31:52
什麼是「開」和「關」? – Philip 2011-04-07 20:38:00
他們是字符串。我需要在報價單內使用它們作爲常規字符串嗎?像「開」和「關」。 – 2011-04-07 20:47:26