如果类没有默认可见性,如何使静态断言失败
Posted
技术标签:
【中文标题】如果类没有默认可见性,如何使静态断言失败【英文标题】:How to fail static assertion if a class doesn't have default visibility 【发布时间】:2017-10-17 11:16:29 【问题描述】:我有一些严重依赖typeid
的模板代码。此外,我们的项目默认隐藏符号可见性:
-fvisibility=hidden -fvisibility-inlines-hidden
由于typeid
使用vague linkange,与typeid
一起使用的类型应该在外部可见,使用:
__attribute__((visibility("default")))
那么,我该如何static_assert
(或至少收到警告)?有可能吗?
我想要做什么
我正在尝试调试自制的Variant
类,它在内部使用typeid
。 Variant
实例存储typeid
及其值,并在您尝试检索给定类型的值时进行运行时类型检查。问题是这个类在.so
边界上的行为不正确。所以我想找到与Variant
类一起使用的所有带有visibility("hidden")
的类型,以避免潜在的问题。
【问题讨论】:
AFAIK 没有办法查询属性 【参考方案1】:无法在 C++ 中检查这一点。您将不得不求助于构建脚本来验证您不会导出太多。例如。如果是 Makefile:
verify-exports: mylib.so
readelf --dyn-syms -W mylib.so | comm -13 api.txt - > unsuppressed.txt
! test -s unsuppressed.txt
【讨论】:
以上是关于如果类没有默认可见性,如何使静态断言失败的主要内容,如果未能解决你的问题,请参考以下文章