Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用#定义BUF 8“;vs"#定义BUF(8)_C - Fatal编程技术网

C &引用#定义BUF 8“;vs"#定义BUF(8)

C &引用#定义BUF 8“;vs"#定义BUF(8),c,C,以下各项之间的区别(如有): #定义BUF(8) 及 #定义BUF 8 我对c编程不是很有经验,也从来没有见过#define只包含1个数字,而不是放在括号中 PS:代码是在64位linux系统上使用带-m32标志的gcc编译的。所以最后的二进制是32位ELF可执行文件。< P>我不能想象它在这个特定的情况下明智地使用时有什么不同,但是考虑一下: #define add(x,y) x+y int i=add(3,5)*2 #define callMy2Funcs(x,y) \ myFu

以下各项之间的区别(如有):

#定义BUF(8)

#定义BUF 8

我对c编程不是很有经验,也从来没有见过#define只包含1个数字,而不是放在括号中


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

< P>我不能想象它在这个特定的情况下明智地使用时有什么不同,但是考虑一下:

#define add(x,y) x+y

int i=add(3,5)*2
#define callMy2Funcs(x,y) \
    myFunc1(x); \
    myFunc2(y);
#define MY_SIZE 16 + 7
#define MY_SIZE2 (16 + 7)

void *x = malloc(8 * MYSIZE);
void *y = malloc(8 * MYSIZE2);
现在你希望我的值是16,对吗?,但它会扩展到i=3+5*2,给我13

HolyBlackCat在评论中写道
float x=sin BUF不会编译,这是完全正确的。然而,使用这样的宏是一个非常糟糕的主意

用括号括起来不会有什么坏处,而且通常会有帮助。宏基本上只是一种高级复制粘贴。因此,如果您可以想象一段代码,其中字符序列
(8)
将产生另一个结果,而不是
8
,那么这两个宏将以相同的方式不同

出于类似的原因,如果宏包含多个语句,最好将它们包含在do while循环中。考虑这一点:

#define add(x,y) x+y

int i=add(3,5)*2
#define callMy2Funcs(x,y) \
    myFunc1(x); \
    myFunc2(y);
#define MY_SIZE 16 + 7
#define MY_SIZE2 (16 + 7)

void *x = malloc(8 * MYSIZE);
void *y = malloc(8 * MYSIZE2);
现在:

if(x>5) 
    callMy2Funcs(x,x);
将扩展到

if(x<5)
    myFunc1(x);
myFunc2(x);

对于这样简单的宏定义(只是一个常量),实际上没有必要将
8
括在
()
中。这对
()
可能会防止一些滥用,但这些示例是人为的,不现实的

但是一旦操作员参与进来,即被替换的文本是一个表达式,添加那些
()
就变得非常重要。例如,如果有一系列相关的清单常量定义也包含负值,那么将这些
()
添加到使用一元
-
的替换中是一个非常好的主意

#define CONSTANT_A 2
#define CONSTANT_B 1
#define CONSTANT_C 0
#define CONSTANT_D (-1)

在这种情况下,为了保持一致性,将它们全部包含在
()
中可能是有意义的。这是个人喜好的问题。

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

#define BUF 8
#define BUF2 (8)

x =  BUF * BUF2;
。。。扩展到

x = 8 * (8);
void *x = malloc(8 * 16 + 7);
void *y = malloc(8 * (16 + 7));
特别是,括号是替换文本的一部分,而不是宏定义的一部分。(但不要将其与类似函数的宏定义混淆,在宏定义中,标识符和左括号之间没有空格。)

在这种情况下,这两个宏定义几乎可以互换使用,但不能完全互换。然而,括号在其他上下文中的区别更大。考虑这一点:

#define add(x,y) x+y

int i=add(3,5)*2
#define callMy2Funcs(x,y) \
    myFunc1(x); \
    myFunc2(y);
#define MY_SIZE 16 + 7
#define MY_SIZE2 (16 + 7)

void *x = malloc(8 * MYSIZE);
void *y = malloc(8 * MYSIZE2);
它扩展到

x = 8 * (8);
void *x = malloc(8 * 16 + 7);
void *y = malloc(8 * (16 + 7));

,它为
x
y
保留了不同的内存量。不,没有。当您想指定操作顺序或使代码更清晰时,可以使用
()
。@Simon有一点不同。例如,
float x=sin BUF
将在一种情况下编译,但不会在另一种情况下编译。可能是重复的。我相信那里的答案非常有用。西蒙:是的,这是不同的。如果其他宏将
##
BUF
一起使用,则
8
可能会在
(8)
不会产生有效标记的情况下产生有效标记。据我所知,
定义
应该是constant@Simon#定义宏。有些人说宏应该只用于定义常量。(我知道那些人错了!)@ikegami请不要在帖子刚发布时进行编辑。“当我在改进我的职位时,这让我很恼火。”SergeyA True。修正了。@ikegami抱歉,不是故意忘恩负义。但最好在评论中指出这一点。在一篇旧文章上,你可以编辑它而不发表评论。谢谢你把它修好。