关于内联与#define的C ++ FAQ示例

时间:2013-12-07 17:42:46

标签: c++

FAQ上有一个例子来解释inline和#define之间的区别。代码在这里 链接是:http://www.parashift.com/c++-faq/inline-vs-macros.html

尝试使用Visual C ++,unsafe()unsafe(f())都没有增加i两次。这个例子有错吗?

2 个答案:

答案 0 :(得分:5)

#define的主要思想是它只是一个预处理器指令,意思是:

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

将在编译之前预处理代码,并将替换语句

unsafe(x++);

以下

((x++) >= 0 ? (x++) : -(x++));

每次评估x ++时,x都会递增。

如果您在获取此示例代码时遇到问题,可能的原因可能是您使用优化编译代码来优化所有未使用/不必要的代码。

如果你不在任何地方使用你的x,那么它被认为是未使用的,因此不会被包含在编译代码中。

答案 1 :(得分:0)

刚刚测试了这个示例,请检查Eric Gopak's answer以获取解释:

// A macro that returns the absolute value of i
#define unsafe(i)  \
    ((i) >= 0 ? (i) : -(i))

// An inline function that returns the absolute value of i
inline
int safe(int i)
{
    return i >= 0 ? i : -i;
}

int countCalls = 0;

int f()
{
    return countCalls++;
};

int main()
{
    int x = 0;
    int ans = 0;

    ans = unsafe(x++);   // Error! x is incremented twice
    ans = unsafe(f());   // Danger! f() is called twice

    // x = 2
    // countCalls = 2

    ans = safe(x++);     // Correct! x is incremented once
    ans = safe(f());     // Correct! f() is called once

    // x = 3
    // countCalls = 3

    return 0;
}