如果 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
我有一些严重依赖 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