首页
学习
活动
专区
圈层
工具
发布

为什么是int main()而不是void main()

C 在C89 中,main( ) 是可以接受的的经典巨著(C程序设计语言第二版)用的就是main( )不过在最新的C99 标准中,只有以下两种定义方式是正确的: int main( void ) int...main( int argc, char *argv[] ) 如果不需要从命令行中获取参数,请用int main(void);否则请用int main( int argc, char *argv[]...C++ 正如C++ Primer Plus这本书中说的C++98中定义了如下两种main函数的定义方式: int main( ) int main( int argc, char *argv[] ) int...main( )等同于C99中的int main( void );int main( int argc, char *argv[] )的用法也和C99中定义的一样同样,main函数的返回值类型也必须是int...void main中如果main函数的返回值不是int类型,就根本通不过编译发出警告,所以,如果你想你的程序拥有很好的可移植性,请一定要用int main 4.返回值的作用 main函数的返回值用于说明程序的退出状态如果返回

4.2K70
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    int a; int* a; int** a; int (*a)[]; int (*a)(int)

    a) int a;表示一个内存空间,这个空间用来存放一个整数(int); b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c) int...e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。...(可以结合函数指针一并看看......) int*p[4]------p是一个指针数组,每一个指向一个int型的 int (*q)[4]---------q是一个指针,指向int[4]的数组。...int (*q)[4]的存储结构如下: 请看以下定义: int a[2][4]={ {2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3...stdio.h> int main(void) { int a[2][4]={ {2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4};

    3.1K10

    LNK2019 无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“ (?invoke_main@@YAHXZ) 中引用了该符号

    使用VS2022开发windows程序时,上报如下错误: LNK2019 无法解析的外部符号 main,函数 "int __cdecl invoke_main(void)" (?...invoke_main@@YAHXZ) 中引用了该符号 在网上寻找答案,说是项目属性要设置为如下图内容,而不能设置为控制台类型,这是因为控制台类型程序的入口函数为main,而窗口程序的入口函数为WinMain...或者wWinMain,IDE中事先声明了main,WinMain,和wWinMain函数的原型的,被封装在IDE内部,只是没有定义,具体定义实现,是需要用户自己定义。...当选择下图中“控制台 (/SUBSYSTEM:CONSOLE)”时,VS内部就会设置宏,将main作为系统入口函数,当选择"窗口 (/SUBSYSTEM:WINDOWS)"时,VS内部就会设置宏,将WinMain...在我的程序开发当中确实编写的入口函数为WinMain,但是链接器设置当前的项目类型为“控制台”时,在链接时,VS2022会去寻找main的定义,这时在我的代码中只有WinMain的定义,却没有main的定义

    38310

    linux内核启动流程分析 - efi_main

    上一篇文章 linux内核启动流程分析 - efi_stub_entry 中,为了叙述方便,我们只是粗略的讲了下efi_main函数,这里我们再具体看下。 ?...有关boot_params的创建及其hdr的初始化,我们在 linux内核启动流程分析 - efi_pe_entry 中有讲到,这里就不再赘述。 继续看该函数的其余部分。 ?...而710行中的image_offset是kernel在内存的起始地址到compressed部分起始地址(startup_32的地址)的偏移量,这个在 linux内核启动流程分析 - efi_pe_entry...linux内核构建结束后,最终生成的文件是 arch/x86/boot/bzImage,这其实是个压缩过的内核,在kernel启动过程中,还要在内存中对内核进行解压,进而得到真正的内核。...继续看efi_main函数的后续部分: ? 该部分主要是解析efi相关的一些参数及加载initrd,在此不详细讲,后面如果用到再一一展开。 继续看efi_main的剩余部分: ?

    4.3K31

    LNK2019 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ) 中被引用

    这个报错网上查了很多,大概原因是: c语言运行时找不到适当的程序入口函数, 一般情况下,如果是windows程序,那么WinMain是入口函数,在VS中新建项目为“win32项目” 如果是dos控制台程序,那么main...win32控制程序,而把代码当win32项目写了,即代码里面使用WinMain()做为函数入口(主函数); 反之也一样,创建项目时,选择了win32项目,而把代码当win32控制程序写了,即代码里面使用main...(6)Win32控制台程序:初始代码模版以main为程序入口,默认情况下,只链接C++运行时库和一些核心的win32库,链接器subsystem参数为console类型,所以编译出来的程序会有黑色的控制台窗口作为呈现标准输入

    18.9K51

    基于C语言--解读main(int agrc,char* argv)(命令行参数+环境变量)

    0.背景 之前学习这个linux的管道的时候,老师上课就讲到了linux系统编程这个管道的时候,main函数里面的这个命令行参数,当时我只是去找了一篇博客学习了一下,但是也只是一知半解,今天是真的系统学习了一下...; 1.主函数的参数的几种类型 上面是是我们的main函数的几个形式,其中这个里面的第一个形式是我们初学的时候经常使用的一个形式,也是我们大部分情况下使用的一个情况; 第二个是包含了两个参数的类型,其中第一个参数就是一个...int类型的argc变量,这个变量表示的就是我们的这个命令行参数的个数(下面会使用具体的案例进行详细的说明),第二个就是每一个命令行的参数的具体的内容; 第三个是具有三个参数的主函数,其中这个第三个参数就是我们的这个...env参数,这个参数表示的就是我们的环境变量,下面也会使用实例进行说明的; 2.只有两个参数的主函数 下面的这个代码就可以帮助我们去理解这个main函数里面的两个参数的具体的含义 我们编译之后就会生成对应的.../a.out运行的时候,这个时候调用strcmp函数的时候返回值就不是0,因此这个就会打印出来我们优先设置好的错误的信息; 我们只需要在这个linux里面使用mv指令把这个可执行程序名字进行修改,修改为

    29800

    C# int int16 Int32 Int64的介绍

    C# int int16 Int32 Int64的介绍 今天看到别人的代码中用到Int32,UInt32相关,想到自己平时用的都是int类型整数,就心生好奇的翻了一下资料: ---- Int32 值类型表示值介于...Int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数。...类型 范围 大小 .NETFramework 类型 short [-2^15 , 2^15 -1] 有符号16位数 System.Int16 int 关键字表示一种整型,该类型根据下表显示的大小和范围存储值...类型 范围 大小 .NETFramework 类型 int [-2^31 , 2^31 -1] 有符号32位数 System.Int32 long 关键字表示一种整型,该类型根据下表显示的大小和范围存储值...类型是unsigned int派生出来的 int是带符号的,表示范围是:-21474 83647 到 21474 83648 uint是不带符号整形,表示范围是0到42949 67295(2^32-1)

    5K30

    嵌入式Linux:main函数的使用方法

    和单片机开发一样,在Linux中,C语言程序的执行通常从main函数开始。main函数是程序的入口点,当程序启动时,操作系统会调用main函数来执行程序的主要逻辑。...不同于单片机开发,通常设置main函数没有参数,Linux开发中main函数有两种形式:一种是不带参数,另一种是带参数。无论使用哪种形式,都需要返回一个整数值,通常用于表示程序的退出状态。...不带参数 int main() { return 0; // 返回0表示程序正常结束 } // 2....带参数 // argc:命令行参数的数量 // argv:命令行参数的数组,其中argv[0]是程序的名称,argv[1]、argv[2]等是传递的参数 int main(int argc, char...以下是一个简单的示例,展示了如何在C程序中获取和使用这些参数: #include int main(int argc, char *argv[]) { // Print the

    55300

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)include int func(int a, int b, int c, int d, int e,

    CMP 指令进行比较两个操作数的大小 4、ARM指令简单代码段分析 C代码: include int func(int a, int b, int c, int d, int e,...int f){ int g = a + b + c + d + e + f; return g;} 对应的ARM指令: add r0, r1 将参数a和参数b相加再把结果赋值给r0ldr.w...没技术可言,还有一个就是阿里如何做到的反调试策略的,这里限于篇幅,只是简单介绍一下原理: 前面说到,IDA是使用android_server在root环境下注入到被调试的进程中,那么这里用到一个技术就是Linux...经过好几次尝试都是一样的结果,所以我们发现这个地方有问题,可能就是反调试的地方了 我们再次进入调试,看见BLX跳转的地方R7寄存器中是pthread_create函数,这个是Linux中新建一个线程的方法...因为现在的IDA调试时需要进程的注入,进程注入现在都是使用Linux中的ptrace机制,那么这里的TracePid就可以记录trace的pid,我们可以发现我们的程序被那个进程注入了,或者是被他在调试

    4.7K62
    领券