FAQ上有一个例子来解释inline和#define之间的区别。代码在这里 链接是:http://www.parashift.com/c++-faq/inline-vs-macros.html
尝试使用Visual C ++,unsafe()
和unsafe(f())
都没有增加i
两次。这个例子有错吗?
答案 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;
}