关于宏定义中参数问题

很多情况下,为了整个程序的方便,我们会使用宏定义,但在宏定义中有很多细节。宏定义只是单纯的进行文本替换,在编译前就已经替换完成,不做表达式计算。

(1)宏名一般用大写 (主要是为了和变量区分,没有硬性要求)

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

(4)宏定义末尾不加分号;(如果加了分号,则会连分号一起替换)

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。

(6)可以用#undef命令终止宏定义的作用域

(7)宏定义允许嵌套 (宏定义允许使用已经定义的宏定义)

(8)字符串( " " )中永远不包含宏

(9)宏定义不分配内存,变量定义分配内存。

(10)宏定义不存在类型问题,它的参数也是无类型的。

还有一种带参数的宏定义。不仅有替换,还有实参替换形参的过程。

(1)要注意参数要加括号,因为不进行表达式计算,不加括号很有可能出现计算先后的错误

(2)带参数宏定义中,宏名与形参表之间不允许有空格。 #define MAX(a,b) (a>b)?a:b

(3)要注意带参数宏和带参数的函数的区别。比如

main()


  int i=1; 
  while(i<=5) 
    printf("%d ",SQ(i++)); 

SQ(int y) 

  return((y)*(y)); 
}

******************************************************************************

#define SQ(y) ((y)*(y)) 
main(
)

  int i=1; 

  while(i<=5) 

    printf("%d ",SQ(i++)); 

 

原文地址:https://www.cnblogs.com/mini-coconut/p/8516801.html