以下宏可能会给应用程序带来什么问题
What problems might the following macro bring to the application?
下面的宏会带来问题吗?
#define sq(x) x*x
如果是,那么如何以及为什么?请帮助。
是的,它可能会出现问题。除了宏根本不尊重命名空间的明显事实(这意味着您不能sq
调用任何其他内容)之外,请尝试以下操作:
int result = sq(4) / sq(4);
您应该用括号将x * x
括起来,使其变得((x) * (x))
。
另一个问题:
int a = 0;
int result = sq(++a);
这是宏固有的问题,也是应该首选内联函数的原因之一。
我不会给你一个直接的答案(这看起来像一个家庭作业问题),但我会给你一个例子,希望能让你思考并提出一个正确的答案:
#include <iostream>
#define sq_macro(x) x * x
int sq_function(int x)
{
return x * x;
}
int print_and_ret(int x)
{
std::cout << x << 'n';
return x;
}
int main()
{
std::cout << "Calling sq_macro:n";
sq_macro(print_and_ret(10));
std::cout << "Calling sq_function:n";
sq_function(print_and_ret(10));
}
运行程序时,宏和函数会提供两种不同的行为。想想什么是宏,什么是函数。
在编写宏时,过度使用括号。重写宏,如下所示
#define sq(x) ((x)*(x))
如果不这样做,那么在将宏用作sq(5+4)
的情况下,您将遇到问题
要了解问题,请进行宏扩展并查看。
如前所述,您应该将参数的每次使用都括在括号中以确保正确的行为,例如,当参数类似于 i * 2
时:
#define sq(x) ((x)*(x))
但还有另一个潜在的问题。请考虑以下事项:
result = sq(++i);
这被翻译成:
result = ((++i)*(++i))
如果意图可能只增加一次i
,它会增加两次。这是宏的常见副作用。
一种方法是在调用它时意识到这一点,但更好的方法是将sq()
放在它自己的内联函数中。
所有这些都可能造成麻烦:
int x = 12;
int n = sq(x+3);
int y = sq(x++);
int z = 2 * sq(2 + n) * n;
与函数sq
进行比较。
首先,运算符优先级会被搞砸:
sq(2+2); // author wants 4*4, but gets 2+2*2+2.
相关文章:
- 我应该使用什么信号来终止/终止Windows上的应用程序
- 在Windows Server 2012上运行VS2019编译的应用程序需要什么?
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- 应用程序仅在安装了 Visual Studio 的 PC 上启动.这种行为的原因可能是什么
- 部署C 应用程序,什么重新分布
- 如果我在库中和应用程序中编译了相同的CPP文件,会发生什么
- 有什么理由更喜欢从 IDE 中运行应用程序而不是运行独立的可执行文件?
- 开发C++应用程序,目标服务器有不同的std lib版本,最佳实践是什么
- pimpl 在 C++ 应用程序/库中的什么位置使用?任何例子
- 从应用程序调用静态库时,QT创建者什么都不会发生
- 将大量数据从C 应用程序传递到SQLServer存储过程的最快方法是什么?
- 生成代码以与不需要重新编译的正在运行的 cpp 应用程序交互的好方法是什么?
- 测试使用visual studio编写的C++android应用程序的最佳方法是什么.不升级到windows专业版
- 将Objective-C应用程序移植到Windows.什么是最好的选择
- 如果您不编写 Web 应用程序,并且您的客户端不是浏览器,那么 Web 套接字相对于常规套接字的优势是什么?
- Cython 带 STL 矢量和没有 NumPy 可以从其他应用程序调用,缺少什么?
- 在Linux上编写OpenGL 4.X应用程序的常用库是什么?
- 仅使用UDP托管小型服务器应用程序的缺点是什么
- 在C#WPF应用程序中使用C++11库的选项是什么
- 在不减慢主应用程序速度的情况下在后端运行成员函数的技巧是什么