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

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

本文关键字:何失败 失败 断言 静态 默认 可见性 如果      更新时间:2023-10-16

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

-fvisibility=hidden -fvisibility-inlines-hidden

由于typeid使用模糊链接范围,与typeid一起使用的类型应该在外部使用可见

__attribute__((visibility("default"))) 

那么,我该如何对此进行static_assert(或者至少得到警告)?有可能吗?

我想做什么

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

在C++中无法检查这一点。你将不得不求助于构建脚本来验证你没有导出太多。例如,在Makefile的情况下:

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