?
. , .
- , . , , / .
( , .. ), .
1: C
:
#define GLUE(A,B) GLUE_I(A,B)
#define GLUE_I(A,B) A##B
#define SECOND(...) SECOND_I(__VA_ARGS__,,)
#define SECOND_I(_,X,...) X
#define SWITCH(PREFIX_,PATTERN_,DEFAULT_) SECOND(GLUE(PREFIX_,PATTERN_),DEFAULT_)
#define EAT(...)
#define PROFILER_UTILITY(MODULE_) SWITCH(ENABLE_PROFILER_FOR_,MODULE_,DISABLED)
#define PROFILER_IS_DISABLED ,EAT
#define PROFILE_START_FOR(MODULE_, msg) SWITCH(PROFILER_IS_,PROFILER_UTILITY(MODULE_),PROFILE_START)(msg)
#define PROFILE_END_FOR(MODULE_, msg) SWITCH(PROFILER_IS_,PROFILER_UTILITY(MODULE_),PROFILE_END)(msg)
... , :
PROFILE_START_FOR(FOO,msg)
PROFILE_END_FOR(FOO,msg)
PROFILE_START_FOR(BAR,msg)
PROFILE_END_FOR(BAR,msg)
PROFILE_START_FOR(BAZ,msg)
PROFILE_END_FOR(BAZ,msg)
; , ENABLE_PROFILER_FOR_xxx FOO, BAR BAZ, , ( ,ON, ), (, ) PROFILE_START(msg)/PROFILE_END(msg); .
FOO , " ": #define ENABLE_PROFILER_FOR_FOO ,ON; : ... -DENABLE_PROFILER_FOR_FOO=,ON; make ; CFLAGS += -DENABLE_PROFILER_FOR_FOO=,ON.
2a: ; SWITCH
#define GLUE(A,B) GLUE_I(A,B)
#define GLUE_I(A,B) A##B
#define SECOND(...) SECOND_I(__VA_ARGS__,,)
#define SECOND_I(_,X,...) X
#define SWITCH(PREFIX_,PATTERN_,DEFAULT_) SECOND(GLUE(PREFIX_,PATTERN_),DEFAULT_)
GLUE ( ). SECOND - , .
SWITCH - . , . ; - , , , , . :
#define ORDINAL(N_) GLUE(N_, SWITCH(ORDINAL_SUFFIX_,N_,th))
#define ORDINAL_SUFFIX_1 ,st
#define ORDINAL_SUFFIX_2 ,nd
#define ORDINAL_SUFFIX_3 ,rd
ORDINAL(1) ORDINAL(2) ORDINAL(3) ORDINAL(4) ORDINAL(5) ORDINAL(6)
... :
1st 2nd 3rd 4th 5th 6th
, SWITCH switch; "" .
, , ( , , , ). SWITCH , PREFIX_/PATTERN_ ( , ).
2b:
case, - ; (, "" "" ), SWITCH . .
:
#define PROFILER_UTILITY(MODULE_) SWITCH(ENABLE_PROFILER_FOR_,MODULE_,DISABLED)
#define PROFILER_IS_DISABLED ,EAT
#define PROFILE_START_FOR(MODULE_, msg) SWITCH(PROFILER_IS_,PROFILER_UTILITY(MODULE_),PROFILE_START)(msg)
#define PROFILE_END_FOR(MODULE_, msg) SWITCH(PROFILER_IS_,PROFILER_UTILITY(MODULE_),PROFILE_END)(msg)
... PROFILER_UTILITY . DISABLED. SWITCH(PROFILER_IS_,PROFILER_UTILITY(MODULE_),PROFILE_START) PROFILER_IS_DISABLED, EAT. PROFILER_UTILITY, , PROFILE_START. PROFILE_END_FOR .
EAT (msg) ; .
, ?
, . , C.