有没有办法在 clang 中检测 C++ 代码中的编译器 -fxxxx 标志?

Is there a way to detect compiler -fxxxx flags in C++ code in clang?

有没有办法在 clang 中检测 C++ 代码中的编译器 -fxxxx 标志?

我不想将整个命令行存储为二进制,我想测试一个单独的选项。

如果指定了一些标志以避免代码在运行时崩溃,我希望它提供编译错误或警告。

在 C++ 代码中没有检测标志存在的好方法。

编译器不会将此标志的存在传达给代码。

您可以编写一些代码来根据标志的存在更改行为,但这样做非常脆弱,并且不能保证实际工作。故意将 UB 引入你的程序中并不是一个特别好的主意。但如果你想这样做,那就是这样的:

void mark_nonnull(__attribute__((nonnull)) int* p) {}
bool deletes_checks_2(int* p) __attribute__((noinline)) {
  mark_nonnull(p);
  if (p) return true;
  else return false;
}
bool deletes_checks() { return deletes_checks_2(nullptr); }

更好的想法是在构建系统级别拦截它。您可以添加一个将测试文件编译为 LLVM IR 的规则,类似于:https://reviews.llvm.org/differential/changeset/?ref=1123266 然后检查生成的 IR 是否存在检查,如果不存在则中止构建。