“ #define BUF 8”和“ #define BUF(8)

Non*_*del 2 c

之间的区别(如果有):

#define BUF (8)

#define BUF 8

我对c编程不太有经验,从来没有见过#define只有1个数字,而且没有将其放在方括号中。

PS:使用gcc -m32标志在64位linux系统上编译代码。因此,最终的二进制文件是32位ELF可执行文件。

Joh*_*ger 7

范围内宏标识符的外观仅由替换文本替换。因此,此代码...

#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


klu*_*utt 6

我无法想象在这种特殊情况下明智地使用它不会产生任何区别,但是请考虑以下几点:

#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)

  • @Simon #define定义了一个宏。有人说宏只能用于定义常量。(恕我直言,这些人错了!) (2认同)
  • @ikegami请在发布新帖时不要进行编辑。当我正在改善自己的职位时,这很烦人。 (2认同)