C++11 获取没有实例的类的vtable指针

C++11 获取没有实例的类的vtable指针,c++11,gcc,clang,C++11,Gcc,Clang,我需要静态捕获类的vtable指针,并尝试为每个主要编译器想出解决此问题的技巧 理想的目标是我可以这样写: void **vtbl = GET_VTABLE(ClassName); 我设法设计了一个MSVC解决方案: #define STRINGIFY(Token) #Token #define MSVC_MANGLE_VTABLE(Class) STRINGIFY(??_7##Class##@@6B@) #define MSVC_VTABLE(Class) (__pragma(warning

我需要静态捕获类的vtable指针,并尝试为每个主要编译器想出解决此问题的技巧

理想的目标是我可以这样写:

void **vtbl = GET_VTABLE(ClassName);
我设法设计了一个MSVC解决方案:

#define STRINGIFY(Token) #Token
#define MSVC_MANGLE_VTABLE(Class) STRINGIFY(??_7##Class##@@6B@)
#define MSVC_VTABLE(Class) (__pragma(warning(suppress: 4483)) __identifier(MSVC_MANGLE_VTABLE(Class)))
注意:我花了相当长的时间才想到那个带有笨拙的MSVC符号名称的字符串化技巧!;)

现在我需要一个GCC解决方案,我认为这很容易,因为它们的符号名是有效的C标识符。我打算用一个简单的外部语言来表达:

extern "C" void **_ZTV9ClassName;
将其包装在宏中,完成。。。除了有个问题;GCC损坏的名称遵循模式
#Name
,其中#是名称中的字符数,即
4Name
9ClassName
,如我上面所写

这似乎是一个真正的问题。。。我想不出任何聪明的方法来创建一个可以接受类名并生成符号名的宏

一个替代的(可能是更好的)解决方案是在C++中找到一些表达式来强制GCC/CLAN(或者一个)以某种方式发射指针。我想不出这样的表达方式。也许有一些GCC或Clang扩展可以用来强制编译器使用指针发出

如果有人有任何想法可以在任何一种方法上取得进展,或者有其他创造性的想法。。。我洗耳恭听

注意,我很乐意依赖C++11的特性


编辑:另外一个想法是,我已经设法用模板将符号名制作成字符串,但是像
\uuu属性(别名)(“name”)
这样的东西需要一个文本,模板似乎不起作用,即使它在编译时被解析了>\u为什么需要vtable指针?所以我可以分析、修改、复制它。静态解析方法指针,等等。我了解如何使用vtable。我在想为什么你需要这些。我实际上是用C++ 11魔术和一些黑客从C++类中派生脚本语言类。它提高了性能,还显著减少了前端api中的样板工作负载,使类可以通过脚本扩展。除此之外,我认为这样的函数也应该存在于工具箱中。Vtables是内部编译器结构,可能会在不通知的情况下进行更改。可以理解,实现者不希望处理由于误用而不可避免地涌入的bug报告。无论如何,用例仍然不清楚。为什么用户编写的C++代码需要知道它的VTBL地址?在生成的代码中,只需直接损坏符号。您能演示C++用户将其类输出到脚本语言所需要做的吗?