2011-01-22 47 views

回答

2

宏是由预处理程序(在编译正确开始之前)被代入您的程序的代码片段。这可能是一个功能块,或者它可能是一个常数值。

使用函数式宏时的警告。请看下面的代码:

#define foo(x) x*x 

如果你打电话foo(3),它将成为(和被编译成)3*3(= 9)。相反,如果您拨打foo(2+3),它将变成2+3*2+3,(= 2 + 6 + 3 = 11),这不是您想要的。另外,由于代码被替换,因此foo(bar++)变为bar++ * bar++,使bar递增两次。

宏是强大的工具,但它可以很容易地拍摄自己的脚,而试图做一些与他们看中的东西。

3

宏是一个预处理器指令,用于定义在编译之前预处理器将替换(或删除)的名称。

例子:

#define MY_MACRO1 somevalue 
#define MY_MACRO2 
#define SUM(a, b) (a + b) 

那么如果在代码(除字符串)中任何地方存在的MY_MACRO1MY_MACRO2一提的预处理与在#define行名称后无论发生什么事替换此。

还可以有宏的参数(如SUM)。在这种情况下,预处理器能够识别的参数,例如:

int x = 1, y = 2; 
int z = SUM(x, y); 

预处理器替换这样的:

int x = 1, y = 2; 
int z = (x + y); 

仅此更换后的编译器得到编译生成的代码。

+0

感谢您的回复。关于“#定义SUM(a,b)(a + b)”,我们应该总是包括a + b之间的+ b吗?谢谢。 – Simplicity 2011-01-22 09:32:19

+0

@SWEngineer在这种情况下,它不会使用圆括号,但考虑以下代码:int z = SUM(a,b)* 3;如果SUM没有括号定义,则会扩展为int z = a + b * 3 ;`,那可能不是你想要的。 – Fiktik 2011-01-22 09:38:34

1

“宏定义”仅指示它们是如何指定的(使用#define指令),而“宏”是定义的函数或表达式。

但是,除了语义之外,它们之间几乎没有什么区别。