首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中,main函数的调用约定是什么?

在C语言中,main函数的调用约定是标准调用约定(Standard Calling Convention)。标准调用约定是一种函数调用的规范,定义了函数参数的传递方式、栈的使用方式以及函数返回值的处理方式。

具体来说,在标准调用约定中,main函数的定义为:

代码语言:txt
复制
int main(int argc, char *argv[])

其中,argc表示命令行参数的个数,argv是一个指向字符串数组的指针,每个字符串表示一个命令行参数。

调用main函数时,操作系统会将命令行参数传递给main函数,并将控制权交给main函数。main函数执行完毕后,将返回一个整数值作为程序的退出状态码。

标准调用约定还规定了函数参数的传递方式。在C语言中,函数参数通过栈来传递。栈是一种后进先出(LIFO)的数据结构,用于存储函数的局部变量、参数和返回地址等信息。

总结起来,main函数的调用约定是标准调用约定,它定义了main函数的参数传递方式、栈的使用方式以及函数返回值的处理方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言函数调用约定

函数调用方和被调用方必须遵守同样约定,即调用约定(Calling Convention)。...是从左到右入栈还是从右到左入栈; [参数弹出方式]:函数调用后,由谁来把栈恢复原状? 函数调用结束后需要将压入栈参数全部弹出,以使得栈函数调用前后保持一致。...函数调用惯例函数声明和函数定义时都可以指定,语法格式为: ‌返回值类型 调用惯例 函数名(函数参数) int __cdecl max(int m, int n); // __cdecl是C语言默认调用约定...,平时编程,我们并没有去指定调用约定,就使用默认 __cdecl。...; 调用者负责栈平衡; 被调用函数返回值是整数时,则返回值会被存放于RAX;浮点数返回xmm0 RAX,RCX,RDX,R8,R9,R10,R11是“易挥发”,不用特别保护(所谓保护就是使用前要

13110

VC 调用main函数之前操作

---- title: VC 调用main函数之前操作 tags: [VC++, 反汇编, C++实现原理] date: 2018-09-16 10:36:23 categories: VC+...+反汇编分析 keywords: VC++, 反汇编, C++实现原理, main函数调用, VC 运行环境初始化 --- C/C++语言中规定,程序是从main函数开始,也就是C/C++语言中以...C语言中规定了main函数三种形式,但是从这段代码上看,不管使用哪种形式,这三个参数都会被传入,程序员使用哪种形式main函数并不影响VC环境调用main函数传参。...只是我们代码不使用这些变量罢了。 到此,这篇博文简单介绍了下在调用main函数之前执行相关操作,这些汇编代码其实很容易理解,只是注册异常代码有点难懂。...,调用这个函数之前是不能进行printf 调用 GetCommandLineA函数获取命令行参数 调用 GetEnvironmentStringsA 函数获取环境变量 调用main函数 ---

2.1K20

Cmain函数几种写法

大家好,又见面了,我是你们朋友全栈君。 1、最标准写法 #include int main() { printf("Hello World!..."); return 0; } 2、把int 换成void #include void main() { printf("Hello World!..."); return 0; } 3、不写int #include main() { printf("Hello World!...多种写法不报错原因 C语言最早时候只是一种规范和标准(例如C89, C11等) 标准推行需要各大厂商支持和实施 而在支持实施时候由于各大厂商利益、理解等问题,导致了实施标准不同,发生了变化...Turbo C Visual C(VC) GNU C(GCC) 所以大家才会看到不同书上书写格式有所不同, 有的返回int,有的返回void,有的甚至没有返回值 发布者:全栈程序员栈长,转载请注明出处

57820

Python定义Main函数

多编程语言都有一个特殊函数,当操作系统开始运行程序时会自动执行该函数。这个函数通常被命名为main(),并且依据语言标准具有特定返回类型和参数。...本文结束时,您将了解以下内容: 什么是特殊name变量以及Python如何定义它 为什么要在Python中使用main()函数 Python定义main()函数有哪些约定 main()函数应该包含哪些代码最佳实践...Python基本main()函数 一些Python脚本,包含一个函数定义和一个条件语句,如下所示: 此代码,包含一个main()函数程序执行时打印Hello World!。...本文将如下示例文件保存为execution_methods.py,以探索代码如何根据上下文改变行为: 在此文件,定义了三个对print()函数调用。前两个打印一些介绍性短语。...()函数调用

3.8K30

Python如何在main调用函数函数方式

一般Python函数定义函数是不能直接调用,但是如果要用的话怎么办呢?...一般情况下: def a():#第一层函数 def b():#第二层函数 print('打开文件B') b()#第二层函数直接调用 结果显示: Traceback (most recent...() 结果: 打开文件B 如果需要调用同一个函数多个函数: 这里先设置了一个全局变量Position_number,然后a()说明这个全局变量,再通过全局变量改变,来调用a()不同函数...python里,如果想要定义一个函数,把列表当c++里形参传进去,显然是不可能。...以上这篇Python如何在main调用函数函数方式就是小编分享给大家全部内容了,希望能给大家一个参考。

9.1K30

ctypesC共享库调用Python函数

概述 ctypes 是Python标准库中提供外部函数库,可以用来Python调用动态链接库或者共享库函数,比如将使用大量循环代码写在C语言中来进行提速,因为Python代码循环实在是太慢了...大致流程是通过 ctypes 来调用C函数,先将Python类型对象转换为C类型,C函数做完计算,返回结果到Python。这个过程相对是比较容易。...现在有个更复杂情况,我想要在C代码调用Python某些函数来完成C代码计算,比如在C代码sort函数,采用Python定义函数来进行大小判断。...这个Python定义函数 ctypes 称为回调函数 (callback function)。也就是说需要把Python函数当作变量传给C语言,想想还是有些难度。...然后Python文件定义这个回调函数具体实现,以及调用共享库my_lib.so定义foo函数: # file name: ctype_callback_demo.py import ctypes

27230

详解Android应用main函数调用

每次循环中,判断fds里哪个可读: 当i=0时,表示有新client,调用acceptCommandPeer创建ZygoteConnection并保存 当i 0时,表示已建立连接socket中有新命令...核心就是利用JNI调用nativefork函数调用之前会执行VM_HOOKS.preFork(),调用之后执行VM_HOOKS.postForkCommon()。...函数虚拟机是保存在栈,每调用一个函数,就将函数相关数据压入栈;执行完函数,将函数从栈中弹出。因此,栈底就是main函数。...在上面的研究,新进程创建后,经历一系列函数调用才到main函数,如果直接调用main函数调用关于初始化函数会一直存在。...为了清理这部分函数,使用了抛出异常方式,没有捕获异常函数会马上结束,ZytoteInit.main之上函数都会结束,达到清理目的。

78620

C++关于main函数几点说明

main()函数,将语句return I;改成函数调用exit(i);,这个程序执行结果不发生变化。exit(i)执行效果是返回操作系统,并将i作为程序返回结果。...exit用于结束进程,返回进程结束代码给操作系统,return用于结束函数调用,返回函数结束代码给调用者。main()函数,return和exit均可达到结束程序,返回结果给操作系统。...C语言程序,当程序出现无法恢复错误时,就可以使用exit()函数退出程序。但是C++程序,exit()函数使用会破坏程序对对象析构函数调用。...C++程序设计,应利用异常处理机制来取代对exit()函数调用。 关于批处理文件几点说明。...如果要对类成员对象进行初始化,那么这些对象构造函数也是main()函数之前执行。如果在这些构造函数调用了其他函数的话,就可以是更多函数先于main()函数之前运行。

92520

Linux下c语言中main函数是如何被调用

当我们shell下执行一个程序时候,shell内部首先会用fork系统调用来新建一个进程,然后再用execve系统调用把目标程序加载到内存,并将其参数及环境变量等压入栈,之后再执行目标程序入口函数...该段汇编代码注释已经把其作用讲很清楚了,大意就是按照c语言calling convention,先把__libc_start_main函数所需参数放入到对应寄存器或栈,再调用__libc_start_main...,把stack_end压入栈,至此,将要调用__libc_start_main函数参数已准备完毕,最后通过call指令,调用__libc_start_main函数。...__libc_start_main函数执行了大段准备代码之后,最终调用了我们main函数。...main函数返回之后,将其结果赋值给result,然后再调用exit(result)作为该程序返回值。 至此,一个程序完整生命周期就结束了。 完。

3.2K20

C语言main函数解析

has been C++, nor has it even been C.”这可能是因为 CC++ ,不接收任何参数也不返回任何信息函数原型为“void foo(void);”。...C99,标准要求编译器至少给 main() 这种用法来个警告,而在c89这种写法是被允许。但为了程序规范性和可读性,还是应该明确指出返回值类型。...//参数1  call _libc_start_main hlt 可以看出,调用_start之前,装载器就会将用户参数和环境变量压入栈。... exit 所执行任何标准清理操作之前,被注册函数按照与注册顺序相反顺序被依次调用。每个被调用函数不接受任何参数,并且返回类型是 void。...main()同样也是一个函数结束时,按出栈顺序调用使用atexit函数注册,所以说,函数atexit是注册函数函数入栈出栈一样,是先进后出,先注册后执行。

2.5K88

C语言与汇编嵌入式编程:main模拟函数调用(两数交换)

函数,具体思路如下: 1、先对swap函数反汇编,并删除ret指令, 注明:swap函数大致处理过程为:把下个地址压入堆栈,然后参数入栈,然后把所有寄存器压入堆栈,分配空间,空间清C然后变量赋值开始程序然后做堆栈平衡清理堆栈...这个定义是非法,即错误函数定义。...所以删除swap:和ret后,main里面不再是一个完整函数,但是又保留了该swap函数基本功能(即,把下个地址压入堆栈,然后参数入栈,然后把所有寄存器压入堆栈,分配空间,空间清C然后变量赋值开始程序然后做堆栈平衡清理堆栈...2、将1汇编代码替换掉call swap, #include main(){ int a=0; int b=0; char *str1="a=%d,b=%...,即a地址 edp+4h,此时不能再使用a这个变量汇编地址了,因为此时ebp已经不再是mainebp mov ecx,dword ptr [eax]

93040

关于函数参数入栈思考(函数调用约定,入栈顺序)

__cdecl调用约定 又称为C调用约定,是C/C++默认函数调用约定,它定义语法是: int function (int a ,int b) // 不加修饰就是C调用约定...由于这种约定C调用约定允许函数参数个数是不固定,这也是C语言一大特色。...---- 2.cout<<++i<<- -i<< i++;输出结果讨论 Visual C++函数调用规范,如果函数任何一个参数表达式包含自增(自减)运算,所有这些运算会在第一个push操作之前全部完成...但是Visual C++运行结果是11,11和10。...由于Visual C++调用对象成员函数之前会先将对象地址存放在寄存器ecx,所以在下一次调用cout.operator<<之前,会先将eax值送入ecx

2.5K31

关于java main函数

我们通常称之为主函数或者main函数。公共和静态就不用说了,这是java程序一个入口,而String args [ ]里面是一些命令参数。...前提: 先说定义: 进程是指计算机程序某数据集合上一次运行活动。 可以这么说,我们写完一段代码(程序)后。...一点解释: 其中main()是一个前台线程,前台进程是程序必须执行完成,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。...常见问题&情形: 应用程序主线程以及使用Thread构造线程都默认为前台线程。 使用Thread建立线程默认情况下是前台线程,进程,只要有一个前台线程未退出,进程就不会终止。...前台线程一般用于处理需要长时间等待任务,如在Web服务器监听客户端请求程序,或是定时对某些系统资源进行扫描 程序。

1.7K20

函数调用三种约定,你都清楚吗

__cdecl、__stdcall、__fastcall是C/C++里中经常见到三种函数调用方式。...其中__cdecl是C/C++默认调用方式,__stdcall是windows API函数调用方式,只不过我们头文件里查看这些API声明时候是用了WINAPI宏进行代替了,而这个宏其实就是_...函数调用,涉及参数传递,返回值传递,调用后返回,这都是通过栈变化来实现,对于三种调用约定而言: __cdecl: C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡。...下面从实例来认识一下这三种调用约定。先来看一个简单不能再简单程序了: ? 三个函数内容都是一样,不同是使用了三种调用方式。我们先来看看在main函数调用三个函数时候汇编代码: ?...上图我们看到了__cdecl由主调函数完成了,那么__stdcall呢,在被调函数Fun3(),转向被调函数结尾处代码,我们看到了这一句: ? 那么Fun1()结尾处又是如何呢? ?

99810

C++调用Python

但是C++一个缺点是比较难找到很好轮子,这也是很多人专用Python一个重要原因。这篇文章我们要介绍是一个比较特殊场景——用C++代码去调用Python函数实现一些功能。...而另一种工作方式:通过Python来调用一些C++或者Fortran实现高性能函数,可以参考这一篇博客。...调用Python函数string.split() C++如果我们想分割一个字符串,虽然说也是可以实现,但是应该没有比Python执行一个string.split()更加方便快捷方案了,因此我们测试一个用...C++调用Pythonsplit函数功能。...总结概要 本文介绍了一个C++内部调用Python中封装函数或者接口方法,从环境配置到具体示例都有讲解,并且在其中包含有不少坑点,需要一步一步去踩。

3.9K30
领券