如果标头包含在另一个标头中,但不包含 CPP,则静态断言

static assert if a header is included in another header but not a cpp

本文关键字:包含 CPP 断言 静态 另一个 如果      更新时间:2023-10-16

我有一个c++库,它使用windows.h中的一些函数,并且有一个实用程序标头,它定义了将一些奇怪的窗口类型转换为标准C ++。

我想知道是否有办法断言实用程序是否包含在另一个标题中。这个想法是只将实用程序包含在.cpp文件中,这样我们就不会用windows.h和 windows 类型以及与包含这些类型(最小/最大等)相关的问题来污染代码库的其余部分。

检查windows.h的标头保护是否使用#ifdef块定义。

#ifdef _WINDOWS_
static_assert(false, "Don't include windows.h in header files!");
#endif

如果它包含在另一个标头中,那是因为 cpp 文件在某处包含它。因此,每个代码最终都会出现在 cpp 文件中。

您可能需要查看模块 ts,它没有标头的传递性质,并且任何导入代码都不会导入模块的导入。


如果您不能使用模块,并且仍然希望通过仅在某些位置允许它来封装标头,则可以将该标头放在特殊目录中,然后仅在某些允许的目标上添加该包含目录。如果任何其他没有该包含目录的"不允许"目标尝试包含它,则会发生编译错误。

请注意,所有没有该包含目录的 cpp 文件都将无法包含标头。但这是一个优势而不是不方便:你必须把它显式地添加到你的构建系统中,这样才容易发现这样的代码。

以下是目录结构:

- src/
a.cpp
b.cpp
- include/       
- private-header/
- windows/
windows-conversion.h

下面是 CMake 的示例:

add_library(using-windows-headers INTERFACE)
target_include_directory(using-windows-headers INTERFACE include/private-header/windows)

然后,您可以基于每个目标链接目标:

target_link_libraries(some-module PRIVATE using-windows-headers)

请注意,仅当您将PRIVATE放在那里时,这才有效,因此任何其他依赖目标都不会有 include 目录。