C++ 当损坏C++;Linux上的名字?
在Linux上g++/clang++C++ 当损坏C++;Linux上的名字?,c++,linux,name-mangling,C++,Linux,Name Mangling,在Linux上g++/clang++ void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*)); 被损坏为\u Z10test10058lPFPvS\u EPFS\u PKvEPFS3\u S\u E 根据g++/clang++,此函数定义中有多少符号 替代品是什么?(S,S0,S1,…) 更具体地说,什么是S3 (编辑-添加一些上下文) 允许通过将符号声明为extern(C++)来执行 不幸的
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
被损坏为\u Z10test10058lPFPvS\u EPFS\u PKvEPFS3\u S\u E
- 根据g++/clang++,此函数定义中有多少符号
- 替代品是什么?(
,S
,S0
,…)S1
- 更具体地说,什么是
S3
extern(C++)
来执行
不幸的是,当前的实现并不总是正确的——我正试图通过实现当前的g++/clang++名称损坏方案来修复它
由于本文档并不十分清晰,我很难理解什么是符号。函数损坏是依赖于编译器的活动,对此没有标准的指导。经过几次实验,我终于理解了符号是如何被替换的。你们可以使用下面的工具来定义符号。特别是,限定类型会创建新符号,并且函数会自行解释符号。指向函数的指针就是另一个符号 下面是我提供的示例的替换的分解
void test10058l(void*(*)(void*)、void*(*)(const void*)、const void*(*)(void*))代码>
我开始报告我关于Linux /OSX GCC C++名字的发现。
为什么你需要知道确切的信息?这取决于实际编译器的实现。您可以使用demangletypeinfo::name()
results顺便说一句。我的问题不清楚,我添加了一些上下文。我将看一看abi::\ucxa\udemangle
这可能会有所帮助。谢谢!是的,我想我的问题缺少一些背景。请再看一看。
_Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
S_ ^^ : Pv void*
S0_ ^^^^^^ : FPvS_E void*()(void*)
S1_ ^^^^^^^ : PFPvS_E void*(*)(void*)
S2_ ^^ : Kv const void
S3_ ^^^ : PKv const void*
S4_ ^^^^^^^ : FS_PKvE void*()(const void*)
S5_ ^^^^^^^^ : PFS_PKvE void*(*)(const void*)
S6_ ^^^^^^^ : FS3_S_E const void*()(void*)
S7_ ^^^^^^^^ : PFS3_S_E const void*(*)(void*)