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

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 类,它在内部使用typeidVariant 实例存储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

【讨论】:

以上是关于如果类没有默认可见性,如何使静态断言失败的主要内容,如果未能解决你的问题,请参考以下文章

包装和可见性

使元素无法操纵可见性

Kotlin学习笔记之可见性修饰符

原子性、可见性、有序性

降低基类属性的可见性

在java中,如果没有给变量指定是公有或是私有,默认是啥?