假设我有两个具有相同参数类型和名称的函数(不在同一个程序中):
std::string foo(int x) {
return "hello";
}
int foo(int x) {
return x;
}
Run Code Online (Sandbox Code Playgroud)
一旦编译,它们会具有相同的损坏名称吗?
是 C++ 中重整名称的返回类型部分吗?
使用gcc,当我使用typeid请求对象/变量的类型时,我得到了与我期望在Windows上获得的type_info :: name方法不同的结果.我用Google搜索了一下,发现RTTI名称是特定于实现的.
问题是,我想获得一个类型的名称,因为它将在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有没有必要评估错误的文件名?)
我希望在托管代码的非托管C++ DLL上使用LoadLibrary,然后在已经损坏的外部函数上调用GetProcAddress.我的问题是你从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中重写每个受影响的函数是最糟糕的选择...
所以,我的问题是:有没有比修补图书馆更好的选择?我有一个简单的解决方案吗?解决这个问题的最佳方法是什么?
我正在编写一个需要访问私有变量的装饰器,并发现了这种差异.有谁能解释一下?
(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"类属性"对于这些是正确的词吗?它们不是静态的,但如果你将其中一个列表或其他可变类型,它就是共享的......
更新
事实上,第二个例子也可以正常工作.这是一个硬件问题(重启帮助).
我正在尝试使用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 …
在 Python 中,我知道名称前面的双下划线会导致 Python 在名称classname前面添加variable,如_classname__variable名称(名称修饰)一样。所以我的问题是,在我被要求修改的 Python/Django 应用程序中,有类型的变量(?)名称tr_rowid_debtor__de_listed_date__lte。这是三个变量(tr_rowid_debtor、de_listed_date和lte)还是 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)
任何建议在这里将不胜感激。
我正在尝试使用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) 考虑以下示例:
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::type要int?
name-mangling ×10
c++ ×7
gcc ×3
c ×2
python ×2
windows ×2
abi ×1
attributes ×1
clang ×1
django ×1
filenames ×1
g++ ×1
java ×1
linker ×1
rtti ×1
type-alias ×1
visual-c++ ×1