如果 class 没有默认可见性,如何使静态断言失败

How to fail static assertion if a class doesn't have default visibility

我有一些严重依赖 typeid 的模板代码。此外,我们的项目默认隐藏符号可见性:

-fvisibility=hidden -fvisibility-inlines-hidden

由于 typeid 使用 vague linkange,与 typeid 一起使用的类型应该在外部可见,使用:

__attribute__((visibility("default"))) 

那么,我该如何 static_assert 解决这个问题(或者至少收到警告)?可能吗?

我想做什么

我正在尝试调试内部使用 typeid 的自制 Variant class。 Variant 实例存储 typeid 及其值,并在您尝试检索给定类型的值时进行 运行 时间类型检查。问题是 class 跨 .so 边界的行为不正确。所以我想找到与此 Variant class 一起使用的所有带有 visibility("hidden") 的类型,以避免潜在的问题。

无法在 C++ 中进行检查。您将不得不求助于构建脚本来验证您没有导出太多。例如。如果是 Makefile:

verify-exports: mylib.so
    readelf --dyn-syms -W mylib.so | comm -13 api.txt - > unsuppressed.txt
    ! test -s unsuppressed.txt