C宏和括号中的参数使用

#define Echo(a) a #define Echo(a) (a) 

我意识到这里可能没有显着差异,但为什么你会想要在宏体内包含a括号内的a ? 它是如何改变它的?

假设你有

 #define mul(x, y) x * y 

如果我说:

 mul(a + 5, 6); /* a + 5 * 6 */ 

现在,如果我轻松改变宏:

 #define mul(x, y) ((x) * (y)) mul(a + 5, 6); /* ((a + 5) * (6)) */ 

请记住,不会评估参数或任何内容,只会执行文本替换。

编辑

有关在括号中包含整个宏的说明,请参阅Nate CK发布的链接 。

只是为了记录,我从这里登陆如何在使用宏时修复数学错误 ,我将尝试在此处扩展此答案以适应其他人。

你在询问有关的区别:

 #define Echo( a ) a #define Echo( a ) ( a ) 

只要你不了解自己的宏(我也不是专家:))这是好的。

首先,您已经(可能)知道存在运算符优先级,因此这两个程序存在巨大差异:

1):

 #include  #define ADD( a , b ) a + b int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 2 + b ); printf( "%d", c ); return 0; } 

输出:

 19 

和:

 #include  #define ADD( a , b ) ( a ) + ( b ) int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( a , b ); printf( "%d", c ); return 0; } 

输出:

15

现在让preplace + with *

 #define ADD( a, b ) a * b 

编译器将a * b视为例如a == 5b == 10 ,其为5 * 10

但是,当你说: ADD ( 2 + a * 5 + b )喜欢这里:

 #include  #define ADD( a , b ) ( a ) * ( b ) int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0; } 

你得到105 ,因为涉及运营商优先权并对待

2 + b * 5 + a

( 2 + 5 ) * ( 5 + 10 )

是的

( 7 ) * ( 15 ) == 105

但是当你这样做时:

 #include  #define ADD( a, b ) a * b int main( void ) { auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0; } 

你得到37因为

  2 + 5 * 5 + 10 

意思是:

 2 + ( 5 * 5 ) + 10 

意思是:

 2 + 25 + 10 

简短的回答,有一个很大的区别:

 #define ADD( a , b ) a * b 

 #define ADD( a , b ) ( a ) * ( a )