一行#if语句

时间:2016-05-19 09:33:28

标签: c c-preprocessor

我有一个配置文件,其中包含许多用于在编译时包含模块的定义。此外,这意味着我必须检查代码内部的定义。每次检查都需要3行才能在一行中完成。

#if FUNC_ENABLED
function_optional_call();
#endif

我正在寻找类似的东西。

CALL(function_optional_call(),FUNC_ENABLED);

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

Skip function call if not defined

但是有可能产生一个普通的makro。

3 个答案:

答案 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

Live on Coliru