败犬日报 2025-11-28
败犬日报 2025-11-28
1. #pragma once 的作用是允许菱形 include 通过编译,这会导致环形 include 也能编译
这个标题也算一个八股知识点。
另外检查环形 include 可以用 clang-tidy 扫描 misc-header-include-cycle。
2. #pragma once 和 include guard 用哪个
投票 #pragma once 的应该更多。虽然这个不是标准的,但是各大编译器都支持,且简短。
而 include guard 要维护宏名,还包括构建时生成的文件,非常麻烦。
3. 任何东西都能 throw
throw 和 std::exception 是解耦的,这可能是一种哲学。
但也是挖坑。
4. 关于怎么 using 导入库的内容
个人更倾向于展开最后一层命名空间。例如:
cpp
namespace A::B::C {
void f();
}
namespace C {
using namespace A::B::C;
}
// 或者
namespace C = A::B::C;namespace fs = std::filesystem; 这样的经典写法就是这个方式。
我认为 using std::string; 的写法即使在源文件里也应该避免。如果头文件 struct 里 std::string,源文件又是 string,不能确定是不是同一个东西,会增加心智负担。