首页
社区
课程
招聘
[旧帖] 函数修饰疑问 0.00雪花
发表于: 2011-4-23 13:18 3898

[旧帖] 函数修饰疑问 0.00雪花

2011-4-23 13:18
3898
C编译方式(extern "C"  )对__cdecl的调用规则会把函数名前加"_"
微软的例子:
http://msdn.microsoft.com/en-us/library/aa295770(v=VS.60).aspx

void    calltype MyFunc( char c, short s, int i, double f );
__cdecl
The C decorated function name is “_MyFunc.”
__stdcall and thiscall
The C decorated name (__stdcall) is “_MyFunc@20.” The C++ decorated name is proprietary.


但是为什么dll导出函数时候
void  extern "C"  __declspec(dllexport) __stdcall Run(HWND hWnd);
===>_Run@4
void  extern "C"  __declspec(dllexport) /*__cdecl*/ Run(HWND hWnd);
===>Run

__stdcall 的确是如上所说,而__cdecl却是"Run"呢?为什么不是所说的"_Run"呢?
网上说的是 extern "C"会取消"_" 但这个和微软的那个例子就有冲突了
http://www.cnblogs.com/railgunman/articles/1790072.html
这里也说:extern "C"是告诉C++编译器以C Linkage方式编译,也就是抑制C++的name mangling机制。例如:
void Test(void);
C++编译器可能实际把它改名为vTest_v,C++的重载/namespace等机制就是这样来的。而
extern "C" void Test(void)
则和C编译器一样为_Test。

这我就有点糊涂了,到底是"_FunctionName"还是"FunctionName"?
我忽略了什么???难道dll导出函数是不一样的?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
This Is my first time to be here on this forum i didnt understand the method of how to get money here please help !!
2011-4-24 05:23
0
雪    币: 9281
活跃值: (18680)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
LZ真是个细心的同学,刚才试验了下果然如此,在百度搜索找到如下信息,分享下

C编译时函数名修饰约定规则:

__stdcall 调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为 _functionname@number。

__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为 _functionname。

__fastcall调用约定在输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number。

使用 MFC 提供的修饰符号 _declspec(DLLexport)

在要输出的函数、类、数据的声明前加上 _declspec(DLLexport) 修饰符表示输出。__declspec(DLLexport) 在 C 调用约定、C 编译情况下可以去掉输出函数名的下划线前缀。extern "C" 使得在 C++ 中使用 C 编译方式成为可能。在"C++"下定义"C"函数需要加 extern "C" 关键词。用 extern "C" 来指明该函数使用 C 编译方式。输出的 "C" 函数可以从 "C" 代码里调用。
2011-4-24 08:38
0
雪    币: 23
活跃值: (31)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
1.you can answer questions here http://bbs.pediy.com/forumdisplay.php?f=20
to make money
2.you may visit anypage of this site continually(just five mins interval),then you can get 1kx per an hour,but you get it until next day(24:00)
3.if you passed the exam,http://bbs.pediy.com/answer.php,you can get 30kx
4.public your articles here,which is valuable and is regarded as treasure,then you can get some kxs.
my English is so so..
2011-4-24 10:10
0
雪    币: 195
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
在哪查到的?我找了半天也没发现?麻烦给个链接吧,谢谢了。
2011-4-24 13:48
0
游客
登录 | 注册 方可回帖
返回
//