我有一个由不同模块组成的程序。模块通过函数调用互连。例如。 State Init调用每个模块的init函数。应该可以禁用模块(从编译中排除)。最简单的方法是使用预处理器定义。但这会产生大量的代码:
#IF MODULE_XXX_COMPILE
ret = module_func(...);
#ELSE
ret = 0;
#ENDIF
我想得到一个像这样的宏:
ret = MOD_COMPILE_CALL(module_func(...));
因此宏检查define是否为1如果是,它执行函数,否则它会跳过执行并返回0。
问题是我的编译器告诉我它不可能在宏中使用#IF
。有办法解决吗?
答案 0 :(得分:6)
而不是在你的宏中使用#if
,这可能不起作用你可以把它拿出来:
#if MODULE_XXX_COMPILE == 1
#define MOD_COMPILE_CALL(fcall) (fcall)
#else
#define MOD_COMPILE_CALL(fcall) (0)
#endif
答案 1 :(得分:3)
是的,这是可能的。
定义IF_MOD_XXX
:
#if MODULE_XXX_COMPILE
#define IF_MOD_XXX(mod_enabled, mod_disabled) mod_enabled
#else
#define IF_MOD_XXX(mod_enabled, mod_disabled) mod_disabled
#endif
使用它:
int ret = IF_MOD_XXX(module_func(), 0);
答案 2 :(得分:1)
这是一个做你想做的事的例子:
insert when 1 = 1 then into F_Flight (planeid, groupid, dateid, flightduration, kmsflown) values
(planeid, (select b.groupid from BridgeTable b where exists (select p.p1id from pilotkeylookup p where b.pilotid = p.p1id)),
(select dd.id from D_Date dd where exists (select p.launchtime from PilotKeyLookup p where dd."Date" = p.launchtime)),
flightduration, kmsflown) select * from PilotKeyLookup p;
如果#if MODULE_XXX_COMPILE == 1
#define MOD_COMPILE_CALL(x) (x)
#else
#define MOD_COMPILE_CALL(x) (0)
#endif
定义为1,则MODULE_XXX_COMPILE
会扩展为MOD_COMPILE_CALL(module_func(...));
。否则,它只是(module_func(...))
。