一行#if语句

One line #if statement

我有一个包含大量定义的配置文件,用于在编译时包含模块。此外,这意味着我必须经常检查代码内部的定义。每次检查需要 3 行是否可以在一行中完成。

#if FUNC_ENABLED
function_optional_call();
#endif

我正在寻找类似的东西。

CALL(function_optional_call(),FUNC_ENABLED);

是否有可能这样做,或者我是否必须使用 3 行表达式。 我知道可以为每个 makro 定义一个 makro。

但是否有可能生成一个通用的宏。

#if FUNC_ENABLED
function_optional_call();
#endif

是编写编译器开关的规范方式。清晰,可读,每个程序员都明白它的作用。

现在这段代码:

CALL(function_optional_call(),FUNC_ENABLED);

完全神秘。目前尚不清楚它的用途,为什么会有宏...它甚至看起来都不像有效的 C。

因此,第一种形式远远优于后者,后者只是丑陋的不良做法。所以不要试图将前者重写成后者。


如果您担心一遍又一遍地重复同一行,那么问题似乎是编译器开关的位置不正确。而是将其放在函数中。或者如果你不能修改功能,做一个包装器。

早些时候,有:

#if FUNC_ENABLED
#    define func_optional() real_func_name()
#else
#    define func_optional()
#endif

你可以在第二种情况下使用一些技巧来避免由分号引起的问题,例如do {} while (0).

在 Boost.PP 的帮助下非常简单,事实上,这正是 BOOST_PP_IF 所做的:

#include <boost/preprocessor/if.hpp>

#define CALL(expr, cond) \
    BOOST_PP_IF(cond, expr,)

每次使用 CALL 都会扩展为 expr 或什么都不扩展,具体取决于 cond 的值。

Live on Coliru