我需要静态捕获类的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来接近它:
extern "C" void **_ZTV9ClassName;
在宏中包裹它,完成...除了有问题; GCC错位名称遵循模式#Name
,其中#是Name中的字符数,即4Name
或9ClassName
,如上所述。
这似乎是一个真正的问题...我想不出任何聪明的方法来创建一个可以获取类名并生成该符号名称的宏。
另一种(可能更可取的)解决方案是在C ++中找到一些表达式来强制GCC / Clang(任何一个)以某种方式发出指针。我无法想到任何这样的表达。也许有一些GCC或Clang扩展可以用来强制编译器用指针发出?
如果有人有任何想法可以推进任何一种方法,或其他一些创意......我全都听见了!
注意,我很高兴依赖于C ++ 11的功能。
编辑:还有一个想法,我已经设法将符号名称伪造为带有模板的字符串,但像__attribute__(alias("name"))
这样的东西需要文字,模板似乎不起作用,即使它已经解决在编译时> _<