败犬日报 2025-03-13
1. 等号两边的求值顺序
cpp
std::map<int, int> m;
m[0] = m.size();
C++17 规定等号处理完右边再处理左边。先计算 m.size()
是 0,然后计算 m.operater[](0)
,所以最终 m[0]
是 0。
C++17 之前没有强制要求顺序。
另外,函数参数的求值顺序是未指定的。
https://zh.cppreference.com/w/cpp/language/eval_order
2. 未指定和实现定义有什么区别
实现定义要求编译器给文档,未指定不要求。
3. 怎么简化有条件的 include
cpp
#if xxx
#include <A/B>
#else
#include <B>
#endif
include 的参数可以是宏,可以写成 #include H_XX
然后用编译参数传入 H_XX
宏。