Skip to content
败犬日报 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,不能确定是不是同一个东西,会增加心智负担。