内联与#define的C++常见问题解答示例

C++ FAQ example on inline vs. #define

本文关键字:常见 问题解答 C++ #define      更新时间:2023-10-16

常见问题解答中有一个示例来解释inline和#define之间的区别。代码在这里链接为:http://www.parashift.com/c++-faq/inline-vs-macros.html

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

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

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

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

unsafe(x++);

具有以下

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

每次计算x++时,x都会递增。

您在正确处理此示例代码方面遇到问题的一个可能原因可能是,您使用优化来编译代码,从而优化掉所有未使用/不必要的代码。

如果您没有在任何地方使用x,那么它将被视为未使用,因此不会包含在已编译的代码中。

刚刚测试了这个例子,请查看Eric Gopak的答案以获得解释:

// 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;
}