c 语言中宏定义和定义全局变量的区别

时间:2023-11-20 20:15:32
  1. 宏定义和定义全局变量的区别:
  2. 1 作用时间不同。
  3. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
  4. 2 本质类型不同。
  5. 宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的。而变量在运行时要为其分配内存。
  6. 3 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
  7. 4 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不支持extern。

在C/C++中,宏定义的有效范围被规定为当前文件内有效。

“当前文件内有效”分为两种情况,一种是定义在头文件中,另一种是定义在源文件中。

在头文件中的宏定义随着头文件一同被包含到源文件中时,此时宏定义在该源文件中有效,当头文件中的宏定义随着该头文件一起被包含到另一个头文件中,而这另一个头文件又被另一个源文件包含,则该宏定义在最终被包含的源文件中同样有效。

当宏定义定义在源文件中时,只在当前源文件中有效,即使当前源文件所对应的头文件被其它源文件包含,由于相应的头文件中不包含宏定义,其它源文件也不能直接使用该宏定义。(也就相当于文件内的私有成员,只能被文件内的成员使用)。

当然在该文件中有效的含义是在宏定义语句之后的部分,同一个文件中宏定义语句之前,使用该宏是无效的。

这就是C语言中宏定义的作用范围,在C++中无论是类内还是方法内都不建议使用宏定义,可用const成员代替,C++中类内的宏定义和方法中的宏定义都是一样的,只跟类所在的文件相关,与类相关的概念(如继承)并没有什么关系。在定义两个相同的宏名对应不同的值时,取最新定义的宏名。

在C++类内或者方法内定义的宏不具有很好的可读性,写出来估计会被同事打死的吧。