C ++宏扩展到函数体

时间:2012-12-12 00:50:10

标签: c++ macros c-preprocessor

我希望能够编写宏CONDITIONALFUNCTION以便

CONDITIONALFUNCTION( FunctionName )
{
    ConditionalExpression()
}

扩展为

bool FunctionName( const Arguments& args )
{
    return ConditionalExpression();
}

这甚至可能吗?

我在SO上找到的最接近的是这个帖子:

Possible to define a function-like macro with a variable body?

除了在那个线程中,我还有一个额外的要求,即大括号内的“body”不是一个完整的有效C ++语句,而是一个表达式(有效地)包含在'if'语句中。

请假设我已经知道这可能是不可能的,而且几乎肯定是愚蠢和邪恶的:)

3 个答案:

答案 0 :(得分:1)

我会假设你有一个很好的理由首先使用宏......

使用您提供的问题的语法是不可能的。

最接近可行的宏语法是:

#define CONDITIONALEXPRESSION(f, c) \
bool f( const Arguments& args ) \
{ return c; }

CONDITIONALEXPRESSION(FunctionName, ConditionalExpression())

这将扩展到问题

中的扩展功能

答案 1 :(得分:0)

是否有任何理由必须在宏中定义函数体?在Microsoft C ++中,像ASSERT()这样的宏分别定义实际函数,然后从宏中引用它。

因此,函数总是被定义,但宏等于调用函数或者根本没有。

除此之外,对于C ++,我可能会使用内联函数。

答案 2 :(得分:0)

je4d已经提供了一种替代方案。我还有其他一些变化:

#define CONDITIONALEXPRESSION(f) \
bool f( const Arguments& args )

#define CONDITIONALRETURN(c) \ 
return (c)

CONDITIONALEXPRESSION(FunctionName)
{
  CONDITIONALRETURN(ConditionalExpression())
}