main函数的概念:

测试程序:

以上四种定义main函数的方法都是正确的。

main函数的本质:

操作系统是希望main函数的有返回值的,这样可以知道main函数的退出状态。

如果程序时异常退出的,在有的系统上面,会得到提示:程序异常退出。

C编译器支持多种不同的main函数原型,因为在早期有C语言,但是没有复杂的操作系统,有些程序甚至直接跑在裸机上,这样的程序的返回值也没有什么意义。所以,由于历史的原因,使得C编译器支持多种不同的main函数原型。

main函数返回值示例程序:

在bcc下的返回值如下:

两个程序可以连着运行:

如果B.exe的返回值是0,则A.exe就会运行,否则不运行。

反过来运行结果如下:

这种使用&&连着运行程序的语法就是操作系统的批处理语法。在linux下就是shell脚本。

我们的main函数最好写成具有int返回值的形式,因为这样就可以将它当做黑盒在批处理语言中通过if 或者其他语句判断返回值,并执行其它操作。

main函数的参数:

gcc编译器常见用法:

示例程序:

 #include <stdio.h>

 int main(int argc, char* argv[], char* env[])
{
int i = ; printf("============== Begin argv ==============\n"); for(i=; i<argc; i++)
{
printf("%s\n", argv[i]);
} printf("============== End argv ==============\n"); printf("\n");
printf("\n");
printf("\n"); printf("============== Begin env ==============\n"); for(i=; env[i]!=NULL; i++)
{
printf("%s\n", env[i]);
} printf("============== End env ==============\n"); return ;
}

argv中的个数是由argc指示的,但是env变量并没有指示其中有多少条环境变量信息,我们只能通过判断空指针来确定。

运行结果如下:

注释掉第24行运行结果如下:

小技巧:

gcc中的属性关键字:

 #include <stdio.h>

 #ifndef __GNUC__
#define __attribute__(x)
#endif __attribute__((constructor))
void before_main()
{
printf("%s\n",__FUNCTION__);
} __attribute__((destructor))
void after_main()
{
printf("%s\n",__FUNCTION__);
} int main()
{
printf("%s\n",__FUNCTION__); return ;
}

第三行先判断当前的编译器是否为gcc编译器,如果不是的话,会定义第4行的宏。

第7行的命令告诉编译器,在调用main之前,先调用before_main函数。而after_main是在main函数执行结束后调用。

运行结果如下:

__FUNCTION__是在gcc编译器中定义的。属于语言的扩展,其他编译器不一定存在。在bcc中是不存在这个关键字的。

回答上面的问题:

main函数不一定是第一个执行的函数。

有属性扩展的编译器中,我们可以人为的在main函数之前加上其它函数。在没有属性扩展的编译器中,main函数是第一个执行的。

小结:

第33课 main函数与命令行参数的更多相关文章

  1. 解析main函数的命令行参数

    原创文章,转载请正确注明本文原始URL及作者. 介绍 写C/C++程序,我们常常需要把main函数的参数作为选项来传递.在linux中,解析选项有专门的函数可以用. int getopt(int ar ...

  2. C++main函数与命令行参数,退出程序

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019 (除动态链接库d ...

  3. Unix系统编程()main函数的命令行参数

    命令行参数输入双引号是什么效果? 好像可以去空格化.

  4. C++-main函数与命令行参数

    1.main函数的概念 C语言中main函数称之为主函数 —个C程序是从main函数开始执行的 下面的main函数定义正确吗? //1 main(){ } //2 void main(){ } //3 ...

  5. main函数与命令行参数

    main函数的概念 C语言中main函数称之为主函数 一个c程序从main函数开始执行的 下面的main函数定义正确吗? main函数的本质 main函数是操作系统调用的函数 操作系统总是将main函 ...

  6. getopt_long函数解析命令行参数

    转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...

  7. Java的main函数(命令行传参)

    javac :编译命令 java  :执行命令

  8. [笔记] 命令行参数 int main(int argc,char *argv[])

    int main(int argc,char *argv[]) // argument count 变量个数 argument values 变量值 C程序的main函数有两个形参* argc:整数, ...

  9. Go 命令行参数,JSON 序列化与反序列化

    #### Go 命令行参数,JSON 序列,反序列化这一节来学习一下Go 如果解析命令行参数,以及JSON 的序列化及反序列化; 命令行参数对于熟悉Linux 的同学来说比较清楚,如: ls -a , ...

随机推荐

  1. Winzip和Winrar命令行的使用

    Winzip和Winrar除了提供丰富灵活的图形界面操作功能外,二者都还具备从命令行模式进行文件的压缩与解压缩操作功能,极大的方便了我们在批处理文件中调用压缩软件.以下给出了二者的常用命令行使用方法: ...

  2. 排序问题Java

    package zhuzhuangtu; import java.util.*; import java.io.*; public class Main{ public static void mai ...

  3. visio基础教程(一)

  4. 466E - Information Graph 巧妙的判断祖先于孩子的关系

    这题说的是给了一个公司员工100000 然后现在又3种操作第一种将y置为x的父亲,第二种操作将文件给第x个人签他签完给他的上司签,一直到没有上司为止,第三种操作问x是否签了第i份文件,然后 我们只要直 ...

  5. java 中list进行动态remove处理

    java中遍历 list遇到需要动态删除arraylist中的一些元素 的情况 错误的方式 for(int i = 0, len = list.size(); i < len; i++){ if ...

  6. ubuntu 中启动SDK manager

    Android SDK安装后,目录结构如下: root@localhost:/home/ranxf/Android/Sdk/android-sdk-linux# ll 总用量 drwxrwxr-x r ...

  7. SQL学习笔记之项目中常用的19条MySQL优化

    在写文章之前,首先感谢 飞友科技 陆老师提供的文档.. 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 0x00 EXPLAIN 做MySQL优化,我们要善用 EXPL ...

  8. Python面试题目之打乱打乱有序列表

    # 要求打乱一个有序列表 # 待处理列表 L1 = [11,22,33,44,55,66,77,] 方法: # 引入random模块,该模块的shuffle方法见下图 import random L1 ...

  9. CSS3 页面中展示邮箱列表点击弹出发送邮件界面

    CSS3 页面中展示邮箱列表点击弹出发送邮件界面 代码: <!DOCTYPE html> <html> <head> <meta charset=" ...

  10. Python安装安装.whl包(安装pylint)

    Python安装安装.whl包(安装pylint) Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. 1,,下载.whl ...