2

我正在创建一个库,每个使用它的生成二进制文件(.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 独立完成它的方法也很有用。

宏定义将始终为整数。

4

2 回答 2

1

沿着这些思路怎么样:

主.cpp:

int checkMyMacro#MY_MACRO;

a.cpp 和 b.cpp:

静态 int *checkMyMacro = &checkMyMacro#MY_MACRO;

导致链接器误用时出现未解决的外部错误。

您可以将第二部分插入定义该宏的标题中。

于 2018-03-22T05:53:32.367 回答
-2

如果您只想防止意外误用,则以下内容可能就足够了:

#if defined(MY_MACRO) && MY_MACRO_MIN > MY_MACRO || MY_MACRO_MAX < MY_MACRO
#error MY_MACRO is out of range
#endif

在您描述的情况下,基本上不可能在运行时之前的任何时候防止恶意滥用。

于 2018-01-05T18:01:22.160 回答