如果标头包含在另一个标头中,但不包含 CPP,则静态断言
static assert if a header is included in another header but not a cpp
我有一个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 目录。
相关文章:
- 无法在UE4中包含BP类到CPP类
- 包含在.cpp文件中包含在 .h 文件时包含
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 链接列表在 cpp 中包含不同的对象类
- 在头文件上包含 cpp 文件是否有缺点?
- 如果标头包含在另一个标头中,但不包含 CPP,则静态断言
- 即使我们有.h文件,C 何时包含CPP
- 使用"生成"包含.cpp文件
- main中的标头包含.cpp有效,但在类中抛出错误
- 在目标 c 项目中包含 cpp 类的逻辑
- 多次包含 CPP 文件
- 在 Visual Studio 中包含 *.cpp 文件的整个文件夹
- 包含.cpp文件而不是 .h 文件以使原版 gcc 能够进一步优化我的代码是个好主意
- 头文件中包含.cpp重新定义错误-实现通用堆栈
- 如何检测.h文件中是否包含.cpp文件中未定义的函数
- 在测试项目中包含.cpp文件的更好方法
- 在main中包含cpp文件时的编译错误:内联函数与非内联函数
- 在模板类的头文件中包含.cpp文件
- 如何在c程序中包含cpp头文件
- 能够包含cpp..但不是页眉?发生了什么事