宏
宏可以实现对语句的同义替换,简单来说就是预处理阶段、编译前的替换(包括符号,变量等)。
#define LOG(x) std::cout << x << std::endl;
LOG("hello")
可以正常使用。
下面通过上图中借用不同开发模型设置的预处理器定义可以完成对代码的自动化,就比如可以完成在调试情况下输出控制台信息,而在开发环境下不输出。
#ifdef LHX_DEBUG
#define LOG(x) std::cout << x << std::endl;
#else LHX_RELEASE
#define LOG(x)
#endif
这样使用ifdef可能有点问题(我也不知道什么问题,视频说的),所以换成下面的形式:
#if LHX_DEBUG
#define LOG(x) std::cout << x << std::endl;
#elif LHX_RELEASE
#define LOG(x)
#endif
使用if 0语句会让被包裹的语句失效:
宏对调试很有帮助?不太懂很有帮助体现在哪里。
auto关键字
使用auto关键字放在声明类型的位置,可以不用指定特定类型,编译器自动来进行调整。
好处:很方便,在某些情况下简化开发。
坏处:滥用会导致代码可读性差,并且出错后难以调整。
如果是临时使用的变量,并且比较复杂,使用auto较为方便,如果需要大段代码使用,最好还是指明类型,增强代码的可读性,下图代码中需要保持一个良好的习惯,在类型位置和大括号前,经常性的加上const,程序可以顺利运行,但其实没有必要,因为类型也并不复杂。
const char* GetName(){return "lhx";
}//需要加上const auto a = GetName();auto b = a;LOG(b)
一般用于如下场景:
class DeviceManager {
private:std::unordered_map<std::string,std::vector<Device*>> m_Devices;
public:const std::unordered_map<std::string, std::vector<Device*>>& getDevice() const {return m_Devices;}
};
int main(){using DeviceMap = std::unordered_map<std::string, std::vector<Device*>>;typedef std::unordered_map<std::string, std::vector<Device*>> DeviceMap;DeviceManager dm;const auto& devices = dm.getDevice();auto devices = dm.getDevice();
}
在不想使用using和typedef的情况下,来短暂的使用auto关键字·,或者在迭代器中短暂的使用,发现非常的方便,记得带上&和const来避免复制!!
最后要注意在方法中返回&的话记得加上const,这个是要多处对应的,涉及到的时候一定要多处检查。