宏定义的作用域及其冲突
来源:互联网 发布:js实现动画效果 编辑:程序博客网 时间:2024/05/22 18:23
在C语言编程中,对一个比较大型的项目,用到的库会比较多,如果设计的稍有疏忽,便可能产生宏定义的冲突。项目中有一个例子就是发生在两个头文件都定义了“ISSPACE(ch)”这个宏,并且两个宏定义不太一致,从而导致了整个工程无法编译。
解决该问题的方法是将该宏undefine,具体的做法是,在紧邻include语句之后对有冲突的宏进行undefine。例如库liba.h和头文件 app_pub.h就有对ISSPACE (ch)的不同定义,如果同时使用这两个文件,就会产生宏定义的冲突,这时,可以将其一个undefine(一个前提是,不是两个头文件定义的宏都会用到):
#include "app_pub.h"#ifdef ISSPACE
#undef ISSPACE
#endif
这样的方法是解决宏定义冲突的一个无奈之举。事实上,宏定义的作用域早就被人诟病,特别放在头文件中,被数次包含之后,在不经意间又被覆盖,然后又被重新使用,也许此时已经不是原来的意思了,而我们在使用时还不知道。
为此,有一个简单的原则可以减少宏定义的冲突,那就是尽量不要将宏定义置于头文件当中,除非有一个非将其置于头文件不可的理由。除此之外,还有一个策略 是,如果一个文件/库的某个函数不会被其他地方所使用,那么就不要将其置于头文件当中(因为宏的作用域是当前文件,不管是在函数还是头部定义,都是作用于当前文件)。头文件应该是接口,而不是大杂烩。
对于c++开发者尽量不要使用宏,因为const定义常量和inline定义函数都优于宏定义,所以在<<effective c++>>中都推荐使用其他c++特性去代替宏。
对于c开发者而言,宏是一个不错的选择,特别是宏里面的#ifdef #undef #else等,还有就是可以自定义变量#define MERGR(x,y) class##x##y能使用MERGR(First,Val)合成标识符classFirstVal。这些特性有助于开发大型项目,但是有些功能谨慎使用。
- 宏定义的作用域及其冲突
- 宏定义及其带来的冲突
- __iomem 的定义及其作用
- Spring中bean的定义及其作用域
- 宏定义引起的冲突
- 有关冲突域的定义
- 宏定义的作用
- 宏定义的作用
- 宏定义的作用范围
- 宏定义#_##的作用
- #与##宏定义的作用
- 宏定义中##的作用
- makefile定义作用及其执行过程
- 对宏定义的作用域的一点思考
- jsp的九大隐式对象及其作用域
- jsp的九大隐式对象及其作用域
- jsp的九大隐式对象及其作用域
- Gradle脚本的变量及其作用域
- [培养习惯的问题]
- 插件技术原理及其C#实现(一)插件技术原理及其特性
- 程序员职业规划发展路线图
- android中Button显示两行字体(spannable)
- 解压rpm文件中的文件
- 宏定义的作用域及其冲突
- IOS中混用ARC和非ARC模式
- Pushbutton && scrren && submit
- 64位Windows上最好的免费软件(Best Free Windows 64-bit Software)
- C# 计算时间间隔的方法
- 关于uitableviewcell的accessoryType属性
- 软件工程师的务实职业生涯规划
- sql 语句的limit的用法
- 将整数转换为宽字符串