之间的区别(如果有):
#define BUF (8)
和
#define BUF 8
我对c编程不太有经验,从来没有见过#define只有1个数字,而且没有将其放在方括号中。
PS:使用gcc -m32标志在64位linux系统上编译代码。因此,最终的二进制文件是32位ELF可执行文件。
范围内宏标识符的外观仅由替换文本替换。因此,此代码...
#define BUF 8
#define BUF2 (8)
x = BUF * BUF2;
Run Code Online (Sandbox Code Playgroud)
...扩展到
x = 8 * (8);
Run Code Online (Sandbox Code Playgroud)
特别是,括号是替换文本的一部分,而不是宏定义的一部分。(但不要将其与类似函数的宏定义混淆,因为在宏和标识符之间没有空格。)
在那种情况下,这两个宏定义几乎可以但不能完全互换地使用。但是,在其他情况下,括号的影响更大。考虑一下:
#define MY_SIZE 16 + 7
#define MY_SIZE2 (16 + 7)
void *x = malloc(8 * MYSIZE);
void *y = malloc(8 * MYSIZE2);
Run Code Online (Sandbox Code Playgroud)
它扩展到
void *x = malloc(8 * 16 + 7);
void *y = malloc(8 * (16 + 7));
Run Code Online (Sandbox Code Playgroud)
,为x和保留不同数量的内存y。
我无法想象在这种特殊情况下明智地使用它不会产生任何区别,但是请考虑以下几点:
#define add(x,y) x+y
int i=add(3,5)*2
Run Code Online (Sandbox Code Playgroud)
现在,您期望我的值为16,对吗?但是它将扩展为i = 3 + 5 * 2,使i值为13。
HolyBlackCat在评论中写道,float x = sin BUF;后者无法编译,这是完全正确的。但是,使用这样的宏是一个非常糟糕的主意。
放在括号内永远不会造成伤害,而且通常会有所帮助。宏基本上只是一种高级复制粘贴。因此,如果您可以想象一段代码,其中的字符序列(8)将产生另一个结果8,而不是,那么这两个宏将以相同的方式变化。
出于类似的原因,如果宏包含多个语句,则最好将它们包含在do-while循环中。考虑一下:
#define callMy2Funcs(x,y) \
myFunc1(x); \
myFunc2(y);
Run Code Online (Sandbox Code Playgroud)
现在这个:
if(x>5)
callMy2Funcs(x,x);
Run Code Online (Sandbox Code Playgroud)
将扩展到
if(x<5)
myFunc1(x);
myFunc2(x);
Run Code Online (Sandbox Code Playgroud)
代替
if(x<5) {
myFunc1(x);
myFunc2(x);
}
Run Code Online (Sandbox Code Playgroud)
解决方法是这样的:
#define callMy2Funcs(x,y) \
do {\
myFunc1(x); \
myFunc2(y); \
} while(0)
Run Code Online (Sandbox Code Playgroud)