定义不评估POD?

时间:2010-07-12 12:57:38

标签: c++ macros c-preprocessor

我正在网上浏览C ++ FAQ Lite。我再次浏览内联,因为我没有找到他们的用途,并想知道如何停止循环依赖,如this回答所示。我第一次尝试这样做,“为什么内联比定义更好。”示例包含以下代码:

#define unsafe(i) \
    ( (i) >= 0 ? (i) : -(i) )

inline
int safe(int i)
{
    return i >= 0 ? i : -(i);
}

int f();

int main(void)
{
    int x(5);
    int ans;

    ans = unsafe(x++);
    cout << ans << endl;
    ans = unsafe(++x);
    cout << ans << endl;

    ans = safe(x++);
    cout << ans << endl;
    ans = safe(++x);
    cout << ans << endl;

    std::cin.get();
    return 0;
}

编辑:

大。打破了错字。并不是因为我没有发现这样的错误或其他任何事情而感到痛苦。

输出现在为6, 9, 9, 11

然而,即使预先增量,第一个值不应该是7吗?

如果宏被调用两次,那么它不是这样的:

unsafe(x)//预先递增不会在调用时修改该值。

unsafe(++ x)//对于所有意图和目的,增量发生在第二次调用之前,所以++ x。这是第一个ans = unsafe(x++),如果它被调用两次。

当我们到达第二个ans = unsafe(++x)时,x不应该增加两次吗?一次通过双重通话,一次是第一次双重通话结束?

1 个答案:

答案 0 :(得分:3)

而不是:

#define unsafe(i) \
    ( (i) >= 0 = (i) : -(i) )

我想你想要:

#define unsafe(i) \
    ( (i) >= 0 ? (i) : -(i) )

回复您的修改:

第一次调用unsafe(x++)后,x为7,即使ans为6.这是因为您有声明:

ans = ( (x++) >= 0 ? (x++) : -(x++) )
在评估最左侧ans之后,

x++被分配到中间x++ 。因此,ans == 6只有x == 7。与unsafe(++x)的区别在于ans已分配给++x,意味着结果为ans == x == 9