查看我在网上找到的源代码,有一组函数包含内联汇编,它们在文件头中的原型非常奇特,直到现在我都没见过,原型名称中的空格如这样:
DWORD64 ASM_INTERNAL_DEF _mul64(DWORD64 dwA, DWORD64 dwB);
这个函数在这个程序的某个地方被调用了:
(IntType)Math::_mul64(v, 8)
注意how _mul64
是从数学命名空间调用的,没有ASM_INTERNAL_DEF
。
更多的海洋程序员可以让我受宠吗?
感谢。
我想补充说,现在代码块告诉我是一个错误,但_mul64
没有名字的第一部分被调用的事实让我觉得还有更多。
答案 0 :(得分:1)
功能名称中没有空格。
函数名称为_mul64
。
DWORD64
是一个定义为__int64
的宏。
ASM_INTERNAL_DEF
很可能也是一个宏,但我不确定它的定义是什么。
所以这与将函数声明为:
相同 __int64 ASM_INTERNAL_DEF _mul64(__int64 dwA, __int64 dwB);
这是一个返回__int64
并且需要2 __int64
个参数的函数。
答案 1 :(得分:1)
功能名称中没有空格。该函数名为_mul64
,返回类型为DWORD64
(unsigned __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 ++语言规范的一部分。它们始终是特定于编译器的扩展。