Misc: 那些放在函数定义前的 _cdecl , _stdcall, _fastcall 到底是什么鬼

如果看一些很底层的代码(比如很多库的代码,或者内核代码),会经常见到形如 _cdecl  ,  _stdcall (这个在Windows下的代码中很常见),  _fastcall (这个比较少见)这一类的东西,到底是什么?

这些其实是用来指示编译器做函数调用的时候,应该如何调用,比如说,

  a)参数的传递是放在寄存器中还是放在栈中

  b)参数是从左传到右还是从右传到左

  etc.

说得专业一点,就是calling convention. 

这些关乎系统底层ABI层面的东西。处理得不好,你的程序在链接的时候就会出现一堆的" Unresolved References" 错误(两个程序在ABI层面上不相容)。

当然一般high-level的程序不需要理会这些。

Reference:

  https://en.wikibooks.org/wiki/Embedded_Systems/Mixed_C_and_Assembly_Programming#Calling_Conventions

  https://en.wikipedia.org/wiki/X86_calling_conventions

:)

时间: 2024-11-23 21:10:20

Misc: 那些放在函数定义前的 _cdecl , _stdcall, _fastcall 到底是什么鬼的相关文章

shell 函数定义及应用

1.函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程. 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分. 使用时, 在shell 中  source  /path fo function_file,函数将保留至用户退出,也可以使用 unset function_name ,撤销函数 函数和shell程序比较相似,区别在于: Shell程序在子Shell中运行 而Shell函数在当前Shell中运

Matlab中函数定义方法

Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件,直接定义: n4.匿名函数: n5.Syms+subs:无需M文件,直接定义: n6.字符串+subs:无需M文件,直接定义. ------------ 1.函数文件+调用函数文件:定义多个M文件 % 调用函数文件:myfile.m clear clc for t=1:10 y=mylfg(t);

js 函数定义的两种方式以及事件绑定(扫盲)

一.事件(例如:onclick)绑定的函数定义放在jsp前面和放后面没影响 二. 1 $(function() { 2 function func(){}; 3 }) onclick通过如下方式绑定事件到jsp中:onclick = "func();" 由于func()在函数中声明,是局部变量,onclick找不到func(),绑定失败. 三. function func(){}; onclick = "func();" 这样绑定没有问题,因为func()此时是全局

python 函数定义

python 函数 ---------------- ---------------- ---------------- ---------------- def test(x): print(x) test(1) # 需要一 一对应多一个不行,少一个也不行 ---------------- ---------------- ---------------- ---------------- def test(x,*y):  #x 表示形参  *y表示可变参数 print(x) print(y)

Bash脚本之函数定义和调用

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行.程序员将这种被封装起来的代码称为功能体,或者叫模块,也称为函数.这样看来是不是和循环类似,循环也是为了方便去多次执行一堆代码,而函数是将一堆代码写在一起,起一个名字,然后在需要这堆代码的时候只需要写上函数的名字即可.在shell脚本编程中,函数是由若干条shell命令组成的语句块,函数里面的内容和shell程序形式上是一致的.不同之处就是,shell代码可以直接被执行,而函数中的内容,不能独立执行,只有被调用的时候才

const 放在函数后

const 放在函数后表示这个函数是常成员函数, 常成员函数是不能改变成员变量值的函数.const 限定符,它把一个对象转换成一个常量.举例:为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明:class Point{public:int GetX() const;int GetY() const;void SetPt (int, int);void OffsetPt (int, int);private:int xVal, yVal;};const成员函数

字符编码、文件操作、函数定义

一.字符编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字符被编

“函数声明”、“函数原型”与“函数定义”辨析

最近在看一本关于C的书,对函数声明和函数定义的定义很是模糊,分不清楚,百度了一下,发现一篇帖子写的很是不错,转载过来: 原文: 对函数的“定义”和“声明”不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立 的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否 正确,实参与形参的类型和个数是否一致),它不包括函数体.————谭浩强 ,<C程

02Scala学习-Scala函数定义、流程控制、异常处理入门实战

一 Scala 函数的定义 按照以下格式定义scala函数. def 函数名称(函数输入参数类型){ //函数的实现提 } 1) 第一个简单的例子 HelloWorld object Test2 { def main(args: Array[String]):Unit = { println("HelloWorld") } } a)可以看到输出语句的结尾没有以“;”结束,因为scala的设计者认为,多大一个字符对开发者来说是痛苦的. 他不太赞成在语句的结束写 “;” , 但你也可以写