经过上节课,大家现在已经有了一个可运行的C语言程序、相关代码和开发环境。
也许你会有一点疑问,为什么是建立main.cpp而不是main.c
另外,printf是什么?main是什么?#include是什么?
嗯,不要急,这些问题我都会慢慢告诉你们。
通过上节课的内容,我们知道代码要想编程程序,是需要一个工具的。
在windows下面,该工具vs提供了;而在linux下面,该工具叫做gcc。
这个工具,就是我们后面会提到的,称为编译器的东西。因为它将源代码编码转译为可运行文件,所以叫做编译器。
为了说明后面的内容,我们先建立一个头文件:
右键单击项目,选择添加→新建项
选择下图中的头文件,文件名输入public.h
然后新加一行代码,如下面所示(基于上课的代码):
#include<stdio.h>
#include“public.h”
intmain(intargc,char**argv,char**env)
{
printf("hello world!\n");
return0;
}
下面我们再来看看代码。任何一个C或者C++的源代码,基本都会有两个部分:头文件引用说明和函数实现
这里#include<stdio.h>就是头文件引用说明部分。它告诉编译器,我这里会用到一些其他文件里面声明的函数。
#include 有两种方式,一种是上文提到,另外一种是用双引号如下面的代码一样
#include“public.h”
两者的区别是,前者告诉编译器,我引用的文件是库文件的头文件(库文件的详细概念后面会讲,这里各位可以简单的理解为操作系统提供的基本函数,用来简化软件开发。),请从系统头文件开始找起;后者告诉编译器,这个头文件是我自己定义的,请先从当前目录找起。
这样编译器就会根据你的指示,去寻找这些头文件。
intmain(intargc,char**argv,char**env)
这行代码,告诉编译器,我这里有一个函数叫做main
它有三个参数argc argv和env,它的返回值是整数
这里特别强调的一点是main函数,在一个程序中只能被实现一次!
因为这个函数有一个特别的函数,它是所有代码的起点,程序的入口函数。
也就是程序运行的时候,会首先运行该函数,而不是其他的函数。
所以这个函数也只能实现一次,否则有多个实现,就相当于是有多个入口,你让程序从哪个进入呢?
毕竟从一个进,其他入口怎么办?所以干脆定义一个规则,一个程序只能定义一个入口。这样大家都好办了。
也许你手上有一本教材,或者别的什么资料,它的main函数是这样给的:
int main(intargc)
int main(intargc,char* argv[])
int main(intargc,char*argv[],char*env[])
甚至干脆是这样的
int main()
以及这样的
void main()
嗯,不要激动,他们都是对的,我也是对的
就像我上面说过的,这个函数只是告诉编译器,我的入口在这里
至于这个入口是个什么样的入口,编译并不太关心。
但是注意!!虽然你甚至可以这样定义main函数:int main(void*param)
可是系统在调用你的这个入口的时候,它会按照 启动时参数的个数( argc )启动时参数的列表( argv )启动时环境变量列表( env )的顺序传递参数。从下图可以看到 param 在运行的时候,系统传递进来的值是 1 。表明启动时只使用了一个参数。其他的参数你可以不要,但是你不能更改系统给你的参数。
所以我们定义main函数最好按照大家的约定来
而且更有意思的是,尽管你可能不想要这三个参数,可是系统仍然会给出,完全无视你的需求
比如我如下定义main函数
从实际调试情况来看,系统仍然将argv(也就是启动参数列表)和env(运行环境列表)传递给了我。只是我需要用一些特殊的手法才能看到这种情况。
所以,大家定义main函数的时候最好采用我给的方法:
intmain(intargc,char**argv,char**env)
既然你无法舍弃,为了程序的可控性,最好还是都拿着——毕竟不管你拿还是不拿,它都在哪里,相对于不可控的情况,拿在手里心里更加踏实。
好了,总结一下:
本节主要学习了以下几点:
1 源代码的构成有两个部分:头文件和函数实现
2 如何建立一个自定义的头文件
3 入口main函数的知识。
那么现在你现在算是基本有了C语言(或者说是C++语言)入门的第一步。
注意第一点!以后不论你接触到的代码有多么复杂或者多么简单,都离不开这个框(否则要么是一个无用的程序,要么是一个错误的程序)。
关于main函数里面其他内容,在下章和后续章节我还会深入下去,所以千万别忘记了。