我正在创建一个库,每个使用它的生成二进制文件(.exe、.so、.dll)都需要不同的命令行定义的宏(-D 选项)。我想确保将成为生成二进制文件一部分的每个翻译单元都使用相同的宏定义进行编译。这是为了例如防止意外的 ODR 违规和其他意外行为。
例如,应该防止这种情况:
g++ -DMY_MACRO=5 a.cpp
g++ -DMY_MACRO=7 b.cpp
ld a.o b.o -o result
该库将提供标头 - library.hpp - 将包含在所有使用它的翻译单元中。我的想法是使用该标题作为创建误用检查的地方。
问题是,最好的方法是什么?
最好按照优先顺序在以下期间检测到滥用:
- 汇编
- 链接
- 运行
由于 C/C++ 编译器的工作方式,在编译期间可能无法实现。但也许至少在链接期间?
我想避免使用外部工具/脚本。我知道可以编写一个脚本来遍历所有目标文件并检查是否都使用了相同的值。但也许有一种对构建系统影响较小的方法,只是重用 C++ 链接器或编译器的工作方式。
独立于平台的解决方案是最好的,但是为 gcc/clang 和 msvc 独立完成它的方法也很有用。
宏定义将始终为整数。