标签: name-mangling

函数的返回类型是重整名称的一部分吗?

假设我有两个具有相同参数类型和名称的函数(不在同一个程序中):

std::string foo(int x) {
  return "hello"; 
}

int foo(int x) {
  return x;
}
Run Code Online (Sandbox Code Playgroud)

一旦编译,它们会具有相同的损坏名称吗?

是 C++ 中重整名称的返回类型部分吗?

c++ name-mangling

7
推荐指数
1
解决办法
1464
查看次数

我可以解读GCC的RTTI名称吗?

使用gcc,当我使用typeid请求对象/变量的类型时,我得到了与我期望在Windows上获得的type_info :: name方法不同的结果.我用Google搜索了一下,发现RTTI名称是特定于实现的.

问题是,我想获得一个类型的名称,因为它将在Windows上返回.是否有捷径可寻?

c++ g++ rtti name-mangling

6
推荐指数
1
解决办法
1882
查看次数

如何在Java中解组Windows文件名?

从Java,我将可执行文件提取到使用File.createTempFile()指定的位置.当我尝试运行我的可执行文件时,我的程序在尝试读取第一行输出时挂起.

我发现如果我尝试从另一个程序运行相同的提取可执行文件,如果我将目录指定为C:\ Documents and Settings\username\Local Settings\Temp\prog.exe,它就可以工作.但是,如果我将目录指定为C:\ DOCUME~1\USERNA~1\LOCALS~1\Temp\prog.exe,我就会挂起.

有没有办法解开我的程序中的波浪号文件名,以便我可以指定一个可以工作的目录名?

(因为我总是喜欢解决语言和API设计问题,Java File.createTempFile()和java.io.tmpdir有没有必要评估错误的文件名?)

java windows filenames name-mangling long-filenames

6
推荐指数
1
解决办法
1332
查看次数

C++名称是否具有确定性(装饰)确定性?

我希望在托管代码的非托管C++ DLL上使用LoadLibrary,然后在已经损坏的外部函数上调用GetProcAddress.我的问题是你从C++编译器确定性得到的错误名称?那就是:如果原始的签名没有改变,名称是否总是被转换为相同的错位名称?

c++ windows name-mangling name-decoration

6
推荐指数
1
解决办法
1404
查看次数

在C++中处理C库匿名结构类型

我们有一个庞大的旧C++应用程序,其中包含许多遗留代码和一些用C编写的外部库.这些库很少更新 - 只有当我们发现错误并且供应商提供补丁时.这发生在上周有一个库,在集成新版本后,我们发现如果我们不在本地修改库(我们显然使用上一版本),我们的构建就会出现以下错误消息:

non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
Run Code Online (Sandbox Code Playgroud)

这是因为库声明了许多句柄类型,如下所示:

#define _Opaque struct {unsigned long x;} *

typedef _Opaque    Handle;
typedef _Opaque    Request;
Run Code Online (Sandbox Code Playgroud)

我们在一些类的函数签名中使用它们:

class MyCls {
public:
    static void* myFct(Handle handle);
    ...
}
Run Code Online (Sandbox Code Playgroud)

这会产生上述错误,因为编译器无法为函数创建正确的名称标记名称,因为_Opaque结构没有名称.

我们当前的解决方法是修补库头文件,显式给结构命名:

//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
Run Code Online (Sandbox Code Playgroud)

这显然很糟糕,因为如果可能的话我们不想触摸库.另一个更糟糕的选择是将类型转换为void*所有函数签名并将它们转换回各自的类型.并且在纯C中重写每个受影响的函数是最糟糕的选择...

所以,我的问题是:有没有比修补图书馆更好的选择?我有一个简单的解决方案吗?解决这个问题的最佳方法是什么?

c c++ gcc name-mangling anonymous-struct

6
推荐指数
1
解决办法
1654
查看次数

Python"私有"名称修改和实例与类属性

我正在编写一个需要访问私有变量的装饰器,并发现了这种差异.有谁能解释一下?

(Python 2.5)

对于在类中定义的属性,命名修改可以正常工作:

>>> class Tester(object):
...    __foo = "hi"

>>> t = Tester()
>>> t._Tester__foo
'hi'
Run Code Online (Sandbox Code Playgroud)

实例属性不起作用(这是我们应该这样做的方式吗?)

>>> class Tester(object):
...     def __init__(self):
...         self.__foo = "hi"

>>> t = Tester()
>>> t._Tester__foo
AttributeError: 'Tester' object has no attribute '_Tester__foo'
Run Code Online (Sandbox Code Playgroud)

PS"类属性"对于这些是正确的词吗?它们不是静态的,但如果你将其中一个列表或其他可变类型,它就是共享的......

更新

事实上,第二个例子也可以正常工作.这是一个硬件问题(重启帮助).

python attributes name-mangling private-members

6
推荐指数
1
解决办法
2661
查看次数

GCC API无法解码自己的导出符号

我正在尝试使用GCCabi::__cxa_demangle来解码从生成的目标文件导出的符号g++.但是,我不变得到错误

mangled_name不是C++ ABI修改规则下的有效名称

这是我调用函数的方式:

std::string demangled(std::string const& sym) {
    std::unique_ptr<char, void(*)(void*)>
        name{abi::__cxa_demangle(sym.c_str(), nullptr, nullptr, nullptr), std::free};
    return {name.get()};
}
Run Code Online (Sandbox Code Playgroud)

(省略错误处理;它出现在完整的在线演示中.)

我测试过的符号来自这个小代码:

namespace foo {
    template <typename T>
    struct bar { bar() { } };
}

void baz(int x) { }

template struct foo::bar<int>;
Run Code Online (Sandbox Code Playgroud)

通过g++ -c test.cpp; nm test.o | cut -d ' ' -f3:

EH_frame1
__Z3bazi
__ZN3foo3barIiEC1Ev
__ZN3foo3barIiEC2Ev
Run Code Online (Sandbox Code Playgroud)

我不确定GCC demangling API的目的是什么,如果它不能解码这些符号 - 它可以成功地解码C++ typeid表示.例如,在测试代码中写入typeid(foo::bar<int>*).name()将产生PN3foo3barIiEE …

c++ gcc abi name-mangling

6
推荐指数
1
解决办法
1361
查看次数

双下划线表示什么?

在 Python 中,我知道名称前面的双下划线会导致 Python 在名称classname前面添加variable,如_classname__variable名称(名称修饰)一样。所以我的问题是,在我被要求修改的 Python/Django 应用程序中,有类型的变量(?)名称tr_rowid_debtor__de_listed_date__lte。这是三个变量(tr_rowid_debtorde_listed_datelte)还是 Python 的某种特殊构造?它发生在为 Django 构建查询字符串的语句中......

query = DeTransaction.objects.select_related().filter(
    tr_rowid_debtor__de_listed_date__lte=to_date,
    tr_rowid_debtor__de_rowid_client__cl_rowid=in_client
).values(
    'tr_rowid_debtor','tr_rowid_debtor__de_listed_date',
    'tr_payment_date','tr_account','tr_to_agency','tr_to_client'
)
Run Code Online (Sandbox Code Playgroud)

任何建议在这里将不胜感激。

python django name-mangling

6
推荐指数
1
解决办法
7349
查看次数

MSVC名称错误

我正在尝试使用MSVC 2015 x86构建Lua和QtLua,我遇到了导出/导入符号的问题.

这是我为建筑Lua 5.3.2做的事情(来源):

cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua5.3.2.lib /OUT:lua5.3.2.dll *.obj 
link /OUT:lua.exe lua.o lua5.3.2.lib 
lib /OUT:lua5.3.2-static.lib *.obj
link /OUT:luac.exe luac.o lua5.3.2-static.lib
Run Code Online (Sandbox Code Playgroud)

到目前为止,它的工作原理和依赖性walker显示函数在没有任何修改的情况下导出.

然后我使用cmake构建QtLua,我有大约100个错误,如:

error LNK2019: unresolved external symbol _lua_close referenced in function "public: virtual __thiscall QtLua::State::~State(void)" (??1State@QtLua@@UAE@XZ)
Run Code Online (Sandbox Code Playgroud)

所以基本上我的问题是DLL导出lua_close和链接器寻找_lua_close.

经过一些搜索后,_lua_close格式似乎是合法的,因为Microsoft文档声明调用的C符号__cdecl带有'_'前缀.

但是,我不明白为什么DLL导出未编码的名称.

在Lua(C文件)中编译时的函数声明

__declspec(dllexport) void (lua_close) (lua_State *L);
Run Code Online (Sandbox Code Playgroud)

在QtLua(C++文件)中编译时的函数声明

extern "C" {
  extern void (lua_close) (lua_State *L);
}
Run Code Online (Sandbox Code Playgroud)

c c++ linker name-mangling visual-c++

6
推荐指数
1
解决办法
489
查看次数

为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?

考虑以下示例:

struct A {
  using type = int;
};

template <typename T>
using B = A;

template <typename T>
typename B<T>::type f() { return {}; }

template B<int>::type f<int>();
Run Code Online (Sandbox Code Playgroud)

Clang 生成符号,int f<int>()而 GCC 生成B::type f<int>()实例化:https : //godbolt.org/z/MCCza4

为什么不同意的编译器,不应该GCC还决心B::typeint

c++ gcc clang name-mangling type-alias

6
推荐指数
1
解决办法
363
查看次数