C++ c+的64位名称损坏+;

C++ c+的64位名称损坏+;,c++,visual-studio-2010,64-bit,name-mangling,C++,Visual Studio 2010,64 Bit,Name Mangling,我有一段代码如下 #pragma comment(linker, "/include:_test@12") < >使用该代码的项目在使用C++ VisualStudio 2010编译代码时,工作状态良好,配置32位(我也是32位Windows机器)。 p>当我将机器改为64位时,会得到链接错误,并使用X64配置,用C++ Visual Studio 2010编译。p> 是32位与64位的C++名字不同吗?如果是,我在哪里可以找到64位C++名字的约定规则? < P>是的,32到64位的

我有一段代码如下

  #pragma comment(linker, "/include:_test@12") 
< >使用该代码的项目在使用C++ VisualStudio 2010编译代码时,工作状态良好,配置32位(我也是32位Windows机器)。 <> p>当我将机器改为64位时,会得到链接错误,并使用X64配置,用C++ Visual Studio 2010编译。p>

是32位与64位的C++名字不同吗?如果是,我在哪里可以找到64位C++名字的约定规则?

< P>是的,32到64位的名字是不同的。一篇涵盖确切格式的合理文章可以是。不过,只需对两个目标进行编译并检查生成的映射文件,就可以很快看出主要差异。根据我的经验,它们几乎是相同的(64位增加了一个小数据,可能会改变其他数据)

简单示例:
void foo()

对于未损坏的std调用,根据参数堆栈的使用情况,长度后缀可能会有很大的不同。VC++的默认64位设置不在下划线前加下划线,也不编码长度后缀。以下是使用纯开箱即用设置编译的32/64位配置:

extern "C" int _stdcall func2(int, int, char*);

32bit: _func2@12
64bit: func2
没有什么意义,是吗

完成电路,未混合的cdecl,它执行以下操作:

extern "C" int _cdecl func2(int, int, char*);

32bit: _func2
64bit: func2

如果他们似乎不厌其烦地让你知道你在输入或输出什么,证据表明你可能是正确的。

事实上可能完全不同。。。如果
test
接收到三个指针参数,则它将从
12
变为
24
。。。啊,这也不是C++函数。这似乎是一个
stdcall
C函数。我从哪里可以了解到这一点。我不熟悉这些概念。我认为我的是stdcall,你举的例子是cdecl。我还有其他几个电话,比如#pragma comment(linker,“/export:test@0=测试“)我应该如何更改这些。一个参考说明将是非常好的。有很多关于C++名字的文档(我把你链接到其中的一个)。您似乎正在使用extern“C”\u stdcall进行导出,如上所示,这在32位和64位中是不同的。微软和维基上到处都是文章。虽然与VB有关,但我喜欢它,因为它能很好地谈论它。无论如何,恐怕您必须将您的#pragmas清理到#ifdef WIN64,然后导入或导出适当的名称。据我所知,64位系统唯一可用的调用约定是
vectorcall
和默认的x64调用约定(这似乎是我在网上可以找到的
快速调用的一个版本)。因此,
\uuuuu cdecl
\uu stdcall
\uu快速调用
\uu thiscall
在编译为64位时都被忽略。维基百科页面已迁移到:
extern "C" int _cdecl func2(int, int, char*);

32bit: _func2
64bit: func2