浅谈宏定义

概念

在 C 语言中,可以采用命令 #define 来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。

在 C 语言中,宏分为 有参数和无参数两种。无参宏的宏名后不带参数,其定义的一般形式为:

#define 标识符 字符串

// 不带参数的宏定义 #define MAX 10

/带参宏定义/ #define M(y) yy+3y

在编译的步骤中:
1.预处理
2.编译
3.汇编
4.链接

预处理器会分析源文件,把它们转换为预处理器记号和空白符。如果遇到的记号是宏名称,预处理器就会展开(expand)该宏;也就是说,会用定义的文本来取代宏名称。出现在字符串字面量中的宏名称不会被展开,因为整个字符串字面量算作一个预处理器记号。

无法通过宏展开的方式创建预处理器命令。即使宏的展开结果会生成形式上有效的命令,但预处理器不会执行它。


宏定义的优点

1.方便程序的修改
使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时, 我们可以用较短的有意义的标识符来写程序,这样更方便一些。
2.提高程序的运行效率

相对于全局变量两者的区别如下:

  1. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
  2. 宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的。而变量在运行时要为其分配内存。
  3. 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
  4. 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不需要extern。

宏定义的缺点

①由于是直接嵌入的,所以代码可能相对多一点。

②嵌套定义过多可能会影响程序的可读性,而且很容易出错,不容易调试。

③对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容