原型

时间:2016-05-18 10:30:38

标签: .net c++11 winapi

查看我在网上找到的源代码,有一组函数包含内联汇编,它们在文件头中的原型非常奇特,直到现在我都没见过,原型名称中的空格如这样:

 DWORD64 ASM_INTERNAL_DEF _mul64(DWORD64 dwA, DWORD64 dwB);

这个函数在这个程序的某个地方被调用了:

(IntType)Math::_mul64(v, 8)

注意how _mul64是从数学命名空间调用的,没有ASM_INTERNAL_DEF

更多的海洋程序员可以让我受宠吗?

感谢。

我想补充说,现在代码块告诉我是一个错误,但_mul64没有名字的第一部分被调用的事实让我觉得还有更多。

2 个答案:

答案 0 :(得分:1)

功能名称中没有空格。

函数名称为_mul64

DWORD64是一个定义为__int64的宏。

ASM_INTERNAL_DEF很可能也是一个宏,但我不确定它的定义是什么。

所以这与将函数声明为:

相同

__int64 ASM_INTERNAL_DEF _mul64(__int64 dwA, __int64 dwB);

这是一个返回__int64并且需要2 __int64个参数的函数。

答案 1 :(得分:1)

功能名称中没有空格。该函数名为_mul64,返回类型为DWORD64unsigned __int64的typedef,如Windows Data Types中所述),带有2个DWORD64个参数。

ASM_INTERNAL_DEF可能是由_mul64实施的calling convention。当从C或C ++等语言调用时,这是必要的装饰,以使编译器有机会正确设置函数调用(传递参数并执行清理)。

调用约定修饰符通常在库代码中实现为宏,以便它可以适应外部设置(如目标体系结构或编译器)。在编译x86平台时,__stdcall__cdecl都是常见的调用约定。对于x64,只有一个调用约定。这是隐含的,而不是明确说明。在这种情况下,宏扩展为空。

调用此函数时,可以忽略该宏。它仅适用于编译器。函数调用如下所示:

DWORD64 arg1 = 42, arg2 = 7;
DWORD64 result = _mul64(arg1, arg2);

<小时/> 注意:调用约定修饰符不是C或C ++语言规范的一部分。它们始终是特定于编译器的扩展。