c - “#define BUF 8”与“#define BUF (8)
问题描述
有什么区别(如果有的话):
#define BUF (8)
和
#define BUF 8
我在 c 编程方面不是很有经验,也从未见过只有 1 个数字的 #define 而不是将其放在括号中。
PS:代码是在 64 位 linux 系统上使用带有 -m32 标志的 gcc 编译的。所以最终的二进制文件是 32 位 ELF 可执行文件。
解决方案
范围内宏标识符的外观仅由替换文本替换。因此,这段代码...
#define BUF 8
#define BUF2 (8)
x = BUF * BUF2;
... 扩展到
x = 8 * (8);
特别是,括号是替换文本的一部分,而不是宏定义的一部分。(但不要将此与类似函数的宏定义混淆,其中标识符和左括号之间没有空格。)
在这种情况下,这两个宏定义几乎可以互换使用,但不完全可以互换使用。然而,括号在其他情况下会产生更大的差异。考虑一下:
#define MY_SIZE 16 + 7
#define MY_SIZE2 (16 + 7)
void *x = malloc(8 * MYSIZE);
void *y = malloc(8 * MYSIZE2);
它扩展到
void *x = malloc(8 * 16 + 7);
void *y = malloc(8 * (16 + 7));
x
,它为和保留不同数量的内存y
。
推荐阅读
- java - Spring Data JPA:org.springframework.beans.factory.UnsatisfiedDependencyException:
- python - 错误元素'
' 不能位于父视图中 - node.js - 将 React Native 应用程序直接发布到 Google Pub/Sub 主题是一种好习惯吗?
- php - 如何在laravel中与翻译的多对多关系中仅获取活动元素
- php - Laravel 5 FTP 检索文件和目录
- jquery - 如何使用 jQuery 提交多个表单数据?
- java - Appium 对象列表为 0
- android - 我可以采取哪些措施来阻止用户克隆我的应用程序?
- python - 将str转换为浮点python
- firebase - 如何使用 vue 和 vuefire 加载 Firebase 数据?