#ifdef inside #define
다음과 같이 작성하려고합니다.
#define COV_ON(x) \
#ifdef COVERAGE_TOOL \
_Pragma (COVERAGE #x)
#endif
COV_ON
이와 같이 정의 할 방법 이 있습니까? 나는 #ifdef
#define 안에 가질 수 없기 때문에 위에서 한 일이 잘못되었음을 알고 있습니다 . ( #
은에서 허용되는 문자가 아닙니다 #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를 사용하는 대신 선택적으로 __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) )
이 괄호는 여전히 사용할 수 있지만 (대부분의 IDE는 아무런 문제가 코드 폴딩이 없습니다) 시작과 끝 윤곽을 얻을 것을 제외하고 IFDEF 유사한 기능이 #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*/
)
#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
언급했듯이 #define에 #ifdef를 포함하는 것은 불가능합니다. 대신해야 할 일은 순서를 반대로하는 것입니다.
#ifdef COVERAGE_TOOL \
#define COV_ON(x) \
etc.
#endif
참고URL : https://stackoverflow.com/questions/5586429/ifdef-inside-define
'Programing' 카테고리의 다른 글
div가 다른 옆에 나타나지 않도록 강제하는 방법은 무엇입니까? (0) | 2020.11.05 |
---|---|
Android에서 활동 스택보기 (0) | 2020.11.05 |
gcc에서 컴파일러 최적화를 비활성화하는 방법은 무엇입니까? (0) | 2020.11.05 |
MongoDB에 이름 컬렉션에 대한 규칙이 있습니까? (0) | 2020.11.05 |
내 pidfile이 / var / run에 있어야합니까? (0) | 2020.11.05 |