内联与#define的C++常见问题解答示例
C++ FAQ example on inline vs. #define
常见问题解答中有一个示例来解释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;
}
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 常见问题TDD与模拟
- 如何理解C++常见问题中的"程序忽略我的输入请求"?
- 内联与#define的C++常见问题解答示例
- C++常见问题 32.8 "pass an object of a C++ class to/from a C function"问题
- 我的C++代码出了什么问题?最不常见的祖先
- 源文件编译器错误 - 常见问题
- C++线程与可见性问题 - 常见的工程实践是什么?
- Windows TreeView常见控件通知和多字节字符集的问题
- C++常见问题解答的不安全宏的解释?
- 轻量级包装器-这是一个常见问题吗?如果是,它的名称是什么
- C++常见问题解答中类层次结构的打印模式
- c++在Windows和Linux上——常见问题