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

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

2011-4-23 13:18
3937
C编译方式(extern "C"  )对__cdecl的调用规则会把函数名前加"_"
微软的例子:
ecdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2K6k6r3&6Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8W2)9J5k6s2g2K6i4K6u0r3L8r3W2T1M7X3q4J5P5g2)9J5c8X3q4S2x3U0V1#2y4K6M7H3i4K6t1^5N6W2)9K6c8q4k6e0i4K6u0W2y4U0m8Q4x3U0W2Q4x3X3g2S2M7%4m8^5

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"会取消"_" 但这个和微软的那个例子就有冲突了
e83K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4F1j5X3I4G2k6%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6J5j5h3W2D9k6%4g2F1L8h3q4F1i4K6u0r3j5i4u0@1K9h3y4D9k6i4y4Q4x3V1j5I4y4K6V1H3x3o6M7J5i4K6u0W2K9s2c8E0L8l9`.`.
这里也说: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导出函数是不一样的?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 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
雪    币: 11326
活跃值: (20347)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回