一行#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
的值。
我有一个包含大量定义的配置文件,用于在编译时包含模块。此外,这意味着我必须经常检查代码内部的定义。每次检查需要 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
的值。