为什么尽量以const,enum,inline替换#define?
1. 先了解下预处理器和编译器
从源代码到获取到可执行程序大致流程如下所示:
Step1:源代码(source code)
Step2:预处理器(preprocessor)
Step3:编译器(compiler)
Step4:目标代码(object code)
Step5:链接器(Linker)
Step6:可执行文件(executables)
抛个问题:从Step1到Step2中的每步文件是否都可以自己通过执行命令来获取,可以的话应该如何来获取?
1)预处理器(preprocessor)
工作时间序列:预处理器 早于 编译器。
工作内容:删除注释、包含(include)其他文件以及宏替换等
常用的预处理有:
#include 功能:包含头文件
#if 功能:条件
#else 功能:否则
#elif 功能:否则如果
#endif 功能:结束条件
#ifdef 功能如果定义了一个符号,就执行操作,等效#if !defined
#define 功能:定义一个符号
#undef 功能:删除一个符号
#line功能:重新定义当前行号和文件号
#error功能:输出编译错误消息,停止编译
#pragma功能:提供机器专用的特性,同时保证与C++的完全兼容
抛个问题:以上宏处理如何使用?
2)编译器
工作时间:晚于预处理器
工作任务:语法分析、语义分析等,最后生成目标文件
2. 分析和#define的区别
1)#define AGE 25,AGE无类型,在进行预处理阶段只有AGE被替换成25的过程,不会进行类型安全检查
2)const int age = 25,age有类型(int),在编译阶段会进行类型安全检查
3)class的常量可以用const来声明,比如static const int MAX_SIZE = 1024;
但是无法用在class内部用#define定义class的专属常量,即不存在private #define 这样的东东
4)使用#define定义"宏函数"时,会出其不意的错误有时候,最好改用inline函数替换#define
5)....
3.特殊情况
1)定义常量字符串
const char* const name = "xiao_ming";
//常量指针法
const std::string name("xiao_ming");
//string常量对象,#include<string>,优先考虑常使用此方法
2)class专属常量
MyClass.h
static const std::string name("BlueSkeJoyn");
//static int cnt = 0;
MyClass.cpp
const std::string CMyClass::name;
//int CMyClass::cnt;
3)const变量
char *str = "BlueSkyJoyn";
//non-const ptr,
const data
const char* str = "BlueSkyJoyn";
//non-const ptr,
const data
char const* str = "BlueSkyJoyn";
//non-const ptr,
const data
char* const str = "BlueSkyJoyn";
//const ptr,
non-const data
char const* const str ="BlueSkyJoyn";
//const ptr,
const data
const char* const str = "BlueSkyJoyn";
//const ptr,
const data
4)STL涉及const
//< T* const
const std::vector<int>::iterator itr = v.begin(); //
*itr = 10; //ok
++itr;
//wrong
//< const T*
std::vector<int>::const_iterator itr = v.begin();
*itr = 10; //wrong
++itr;
//ok
5)限制返回值不可作为左值
const int CMyClass::operator*(const CMyClass &lhs, const CMyClass &rhs);
CMyClass a, b, c;
a * b = c; //wrong!!!!, a*b不能是左值
6)const函数
const成员函数可以用来处理取得的const对象;
两个成员函数如果只是常量性(constness)不同,可以被重载。示例如下所示:
const char& CMyClass::operator[](std::size_t pos) const
{
return m_str[pos];
}
char& CMyClass::operator[](std::size_t pos)
{
return m_str[pos];
}
(END)