我正在创建一个库,每个使用它的生成的二进制文件(.exe、.so、.dll)都需要不同的命令行定义的宏(-D 选项)。 我想确保将成为二进制结果一部分的每个翻译单元都使用相同的宏定义进行编译。这是为了例如防止意外的 ODR 违规和其他意外行为。
例如,应该避免这种情况:
g++ -DMY_MACRO=5 a.cpp
g++ -DMY_MACRO=7 b.cpp
ld a.o b.o -o result
库将提供 header - library.hpp - 将包含在所有使用它的翻译单元中。我的想法是将该 header 用作创建滥用检查的地方。
问题是,最好的方法是什么?
最好按优先顺序在以下期间检测到滥用:
- 编译
- 链接
- 运行时
由于 C/C++ 编译器的工作方式,这在编译期间可能是不可能的。但也许至少在链接期间?
我想避免使用外部工具/脚本。我知道可以编写一个脚本遍历所有目标文件并检查是否所有文件都使用相同的值。但也许有一种对构建系统干扰较小的方法,只需重用 C++ 链接器或编译器的工作方式。
独立于平台的解决方案是最好的,但独立于 gcc/clang 和 msvc 的方法也很有用。
宏定义永远是一个整数。
最佳答案
按照这些思路怎么样:
主要.cpp:
int checkMyMacro#MY_MACRO;
a.cpp 和 b.cpp:
static int *checkMyMacro = &checkMyMacro#MY_MACRO;
导致链接器在误用时出现 Unresolved external 错误。
您可以将第二部分插入到定义该宏的 header 中。
关于c++ - 防止同一个宏在多个翻译单元中有不同的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48118722/