#define PI 3.1416 //正确,该行#前允许有空格 int a;#define N 5 //错误,该行#前不允许有空格外的其他字符 2.参数问题 标识符与参数表的左括号之间不能有空格,否则预处理器会把该宏理解为普通的无参宏定义,故以下是错误的带参宏定义形式。 #define MAX (a,b) ( (a) > (b) ? (a) : (b) )...
第一眼看到这样的宏时,觉得非常奇怪,为什么要用do……while(0)把宏定义的多条语句括起来? 采用这种方式是为了防范在使用宏过程中出现错误,主要有如下几点: (1)空的宏定义避免warning: #define foo() do{}while(0) (2)存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。 (3)如果出现在判断语句...
但是在书写上注意两点MAX和左“(”之间没有空格,因为宏定义把标示符后的第一个空格会认为是标示符与字符串的分割。当然我们在写宏的时候有时候会写多行,这样我们一般用“\”进行分割。 2.加括号 我们说到宏只是简单的替换,即使是函数宏也是这样的,所以为了避免一些优先级的错误不要忘记加括号。 3.宏的副作用 ...
其中x1,x2,…,xn是标识符(宏的参数)。这些参数可以在替换列表中根据需要出现任意次。 在宏的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是在定义一个简单的宏,其中(x1,x2,…,xn)是替换列表的一部分。 当预处理器遇到一个带参数的宏,会将定义存储起来以便后面使用。在后面的程序中,如果任何地...
这还是定义的宏函数SUM(x)吗?显然不是。编译器认为这是定义了一个宏:SUM,其代表的是(x) (x)+(x)。 为什么会这样呢?其关键问题还是在于SUM 后面的这个空格。所以在定义宏的时候一定要注意什么时候该用空格,什么时候不该用空格。这个空格仅仅在定义的时候有效,在使用这个宏函数的时候,空格会被编译器忽略掉。
1、宏定义有无参数宏定义和带参数宏定义两种。无参数的宏定义的一般形式为 # define 标识符 字符序列其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔。这种宏定义要求编译预处理程序将源程序中随后所有的定名的出现(注释与字符串常量中的除外)均用字符序列替换之。前面经常使...
5.宏定义中的空格 另外还有一个问题需要引起注意,看下面例子: #define SUM (x) (x)+(x) 这还是定义的宏函数SUM(x)吗?显然不是。编译器认为这是定义了一个宏:SUM,其代表的是(x) (x)+(x)。 为什么会这样呢?其关键问题还是在于SUM 后面的这个空格。所以在定义宏的时候一定要注意什么时候该用空格,什么...
c语言进阶篇:宏 define本质上是将文本内容在编译时进行替换,又因为他可以替换参数所以就出现了宏。 #define替换文本 语法:#define name stuff 举一个例子 #define MAX 1000 #define reg register//为 register这个关键字,创建一个简短的名字...
在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些##来替代空格。 1#defineTYPE1(type,name) type name_##type##_type2#defineTYPE2(type,name) type name##_##type#...
这还是定义的宏函数SUM(x)吗?显然不是。编译器认为这是定义了一个宏:SUM,其代表的是(x) (x)+(x)。 为什么会这样呢?其关键问题还是在于SUM 后面的这个空格。所以在定义宏的时候一定要注意什么时候该用空格,什么时候不该用空格。这个空格仅仅在定义的时候有效,在使用这个宏函数的时候,空格会被编译器忽略掉。