如果未定义,则跳过函数调用

时间:2016-03-16 09:32:15

标签: c macros c-preprocessor

我有一个由不同模块组成的程序。模块通过函数调用互连。例如。 State Init调用每个模块的init函数。应该可以禁用模块(从编译中排除)。最简单的方法是使用预处理器定义。但这会产生大量的代码:

#IF MODULE_XXX_COMPILE
     ret = module_func(...);
#ELSE
     ret = 0;
#ENDIF

我想得到一个像这样的宏:

ret = MOD_COMPILE_CALL(module_func(...));

因此宏检查define是否为1如果是,它执行函数,否则它会跳过执行并返回0。 问题是我的编译器告诉我它不可能在宏中使用#IF。有办法解决吗?

3 个答案:

答案 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(...))