【C++】灵活使用C/C++宏定义
来源:互联网 发布:网络血滴子是什么意思 编辑:程序博客网 时间:2024/05/19 02:06
灵活使用C/C++宏定义
#define宏定义在C语言中有广泛使用。对于C++语言,《Effective C++》第二章告诉我们,在C++中尽量用const、enum、inline替换#define,可以避免很多陷阱。其中const用于定义常量,enum用于定义枚举,inline用于定义内联函数。
尽管《Effective C++》第二章指出#define宏定义的诸多陷阱,这不代表作者不希望我们使用#define。#define的作用是,在预编译阶段,编译器将#define定义的代码段替换到使用相应宏定义的位置上去,相当于直接将代码替换宏,如果宏定义是安全的、简单的,那么#define宏定义会有很大的作用。很多著名C++第三方库使用了大量的宏定义,可以说明这一点。
来看看Eigen矩阵库。Eigen是基于模板的C++开源矩阵库,使用或者支持Eigen的知名项目有Google的TensorFlow、Point Cloud Library、OpenCV等。Eigen运用了大量的模板,为了管理这些模板,Eigen使用了大量的宏,我摘要一段如下,其中##符号表示连接两个字符串:
#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \...#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \...EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int, i)EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float, f)...
上述写出的宏定义代码,定义了
Matrix2i<->Matrix<int, 2, 2>;Matrix2f<->Matrix<float, 2, 2>;Matrix3i<->Matrix<int, 3, 3>;Matrix3f<->Matrix<float, 3, 3>
四个数据类型。用上述宏定义的方法可以用很少的代码,扩展定义更多的类型。
再来看看VTK。我展示VTK用于定义set/get函数的代码:
//宏定义#define vtkSetMacro(name,type) \virtual void Set##name (type _arg) \ { \ vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " #name " to " << _arg); \ if (this->name != _arg) \ { \ this->name = _arg; \ this->Modified(); \ } \ } #define vtkGetMacro(name,type) \virtual type Get##name () { \ vtkDebugMacro(<< this->GetClassName() << " (" << this << "): returning " << #name " of " << this->name ); \ return this->name; \ } //定义set/get函数 vtkSetMacro(CurrentCursor,int); vtkGetMacro(CurrentCursor,int);
上述代码很方便地定义了 virtual void SetCurrentCursor(int _arg);
virtual int GetCurrentCursor();
这就免得我再去手写一大堆代码。可见宏定义用于定义是很方便的。
另外我附上如果根据操作系统宏来定义不同数据的示例代码:
#ifdef _WIN32
#define SMARTPOINTER(type) std::tr1::shared_ptr<type> SP;
#else
#define SMARTPOINTER(type) std::shared_ptr<type> SP;
#endif
//下面的代码编译错误
//#define SMARTPOINTER(type) \
//#ifdef _WIN32 #define std::tr1::shared_ptr<type> SPA; \
//#else #define std::shared_ptr<type> SPA; #endif
这里看出,如果#define内部还有复杂的宏命令,则编译器很难给出正确的编译结果。尤其是使用旧版本编译器,必须要注意宏定义不能过于复杂。
- 【C++】灵活使用C/C++宏定义
- C宏定义使用
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- C 宏定义的使用
- C语言宏定义详解 - [C,C++]
- C/C++,指针的定义和使用
- C语言宏定义的使用
- C语言宏定义使用技巧
- C语言宏定义使用技巧
- c语言宏定义的使用(一)
- c语言宏定义的使用(二)
- C语言宏定义使用技巧
- C语言宏定义使用技巧
- C语言宏定义使用技巧
- C语言宏定义使用技巧
- 在c/c++ 使用宏定义 注释 //
- 图算法专题四总结
- java数据结构:排序算法(1)
- $.ajax()错误与查看response信息
- Middle-题目111:54. Spiral Matrix
- 使用了非标准扩展: 限定名中使用了枚举
- 【C++】灵活使用C/C++宏定义
- github个人页面初步搭建
- Middle-题目112:152. Maximum Product Subarray
- SESSION 与COOKIE的区别
- Java IO - FilterReader&FilterWriter
- 免安装Tomcat服务的安装
- SDNUOJ1012(区间合并)
- 练习三 Problem X
- document.cookie