我有一个配置文件,其中包含许多用于在编译时包含模块的定义。此外,这意味着我必须检查代码内部的定义。每次检查都需要3行才能在一行中完成。
#if FUNC_ENABLED
function_optional_call();
#endif
我正在寻找类似的东西。
CALL(function_optional_call(),FUNC_ENABLED);
是否有可能做到这一点或我必须使用3行表达式。 我知道可能为每个makro定义一个makro。
Skip function call if not defined
但是有可能产生一个普通的makro。
答案 0 :(得分:4)
if (Ckbox.Checked == true)
{
....
if (i == 4)
cmd4.Parameters["@Email"].Value = sdt;
else
cmd4.Parameters["@Name"].Value = Name;
cmd4.Parameters["@FID"].Value = FID1;
cmd4.ExecuteNonQuery();
}
是编写编译器开关的规范方法。很明显,它是可读的,每个程序员都能理解它的作用。
现在这段代码:
#if FUNC_ENABLED
function_optional_call();
#endif
完全是神秘的。目前尚不清楚它是什么,为什么有宏...它看起来甚至看起来都不是有效的C.
因此,第一种形式远远优于后者,这只是丑陋,不好的做法。因此,不要试图将前者重写为后者。
如果你担心一遍又一遍地重复同一行,那么问题似乎是编译器开关的放置不正确。把它放在函数内部。或者,如果您无法修改该功能,请创建一个包装器。
答案 1 :(得分:1)
早些时候,请:
JLayer
你可以在第二种情况下使用一些技巧来避免分号引起的问题,例如: #if FUNC_ENABLED
# define func_optional() real_func_name()
#else
# define func_optional()
#endif
。
答案 2 :(得分:0)
在Boost.PP的帮助下,这很容易,事实上这正是BOOST_PP_IF
所做的:
#include <boost/preprocessor/if.hpp>
#define CALL(expr, cond) \
BOOST_PP_IF(cond, expr,)
CALL
的每次使用都会扩展为expr
或根本不会扩展为cond
。