c++ - 为什么#define不能被迭代使用?
问题描述
#include <stdio.h>
#define ONE 3 > 2 ? 16 : 64
#define TWO ONE/16
int main () {
printf("%d\n", TWO);
return 0;
}
我写了两个#define
,但输出是 16,而我预计它是 1。为什么会发生这种情况?
解决方案
宏是一种简单的文本替换。当预处理器遍历代码时,它会替换
printf("%d\n", TWO);
和
printf("%d\n", ONE/16);
然后用
printf("%d\n", 3 > 2 ? 16 : 64/16);
然后编译器可以看到三元运算符条件的计算结果为 true 并采用第一个结果 - 16
。
您可能希望将第一个宏括在括号中:
#define ONE (3 > 2 ? 16 : 64)
但我强烈建议尽可能避免使用宏。正如评论所暗示的,
constexpr auto ONE = 3 > 2 ? 16 : 64;
会给你预期的结果。
推荐阅读
- php - PayPal 中遇到的格式不正确的数值
- azure - 使用u-sql查询姓名和城市
- dart - 在 StatelessWidget 中使用 StatefulBuilder 时使用 dispose()
- javascript - 关闭页面前的 JQuery ajax 清理代码
- java - 如何构建 Java `Map
` 出 ` 列表 >`? - python - 使用 __file__ 时出现 Python 错误 [WinError 123](文件名、目录名或卷标语法不正确)
- firebase - 无法从 Firebase 控制台下载 google-services.json
- python - 使用递归时,列表不会添加任何新元素
- opengl - glMapBuffer 在 Mac 上返回 NULL,在 Windows 上工作得很好
- c++ - 我以后可以将我的 Visual C++ win32 项目转换为跨平台吗?