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

时间:2018-01-26 14:38:12

标签: c++ windows c++17

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果它包含在另一个标题中,那是因为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放在那里时才会有效,因此任何其他相关目标都不会包含目录。