【发布时间】:2016-01-21 13:11:26
【问题描述】:
这是一个理论问题:假设您有一个库并且它有两个标题。是否有可能使用 C++ 或预处理器宏或两者的组合来实现以下行为:
- 依赖项目可以在任意数量的编译单元中包含 Header 1 或 Header 2 而不会出错。
- 从属项目不能包含这两个标头,即使它跨越不同的编译单元。
对于第二种情况,我想要一些会导致某种错误(例如链接器错误)的构造。我不需要给出一个很好的错误消息,我只想禁止在同一个依赖项目中包含两个不兼容的标头。这可能吗?
示例:
Header1.h
// type definitions for foo, Version 1
...
Header2.h
// type definitions for foo, Version 2
...
场景 1:
// (linker) error, versions do not match
CompilationUnit1.cpp <-- Header1.h
CompilationUnit2.cpp <-- Header2.h
场景 2:
// ok, versions match
CompilationUnit1.cpp <-- Header2.h
CompilationUnit2.cpp <-- Header2.h
【问题讨论】:
-
我认为这不可能!
-
@Eva 你对编译器有什么限制吗?有一种方法,但它不便携。
-
我倾向于同意。预处理器宏基于每个 TU 应用。唯一可靠生成的链接器错误是“未定义符号”,这不是由包含 more 标头引起的。 ODR 违规是下一个最明显的候选者,即使不能正式诊断。这些失败是因为两个 TU 可能在这里包含相同的标头。
-
@AdrianoRepetti:我们主要使用 Visual Studio 2013,但也有一些(极少数)项目需要使用 gcc 构建。
-
如果你也写了lib,那么可能有办法。在 lib 中创建一个全局 int(或更高级的 sigleton)。在两个标题中为其提供 extern decls。让每个标头都有一个静态对象,该对象使用一个检查全局值然后设置它的函数进行初始化。每个标题对正确的标题都有自己的想法。如果错了,宾果游戏。
标签: c++