函数声明与函数定义分别在程序中的什么位置?为什么?
发布网友
发布时间:2022-04-23 23:13
我来回答
共2个回答
热心网友
时间:2022-04-23 22:21
函数,是编程语言中可以独立运行的一个代码块。
在C语言中,程序从main()函数开始运行,其他函数要被main函数调用才可以运行。
在从shell解释器运行编译好的可执行程序时,main函数会被shell启动,开始运行。
C语言的函数在使用时要经过3个步骤:声明、定义、调用。
函数声明,就是给出函数的原型,让程序员知道怎么给函数传参数,怎么接收返回值,让编译器知道怎么进行代码的类型检查。main函数的声明是这样的:
int main();
它的返回值是int类型,不需要传参数。
printf()函数的声明是这样的:int printf(const char* fmt, ...);
它的返回值是int类型,第一个参数是格式字符串,之后可以跟可变参数。
函数声明的语法是:
返回值类型 函数名(形参类型0 形参变量0, 形参类型1 形参变量1);
如果有多个形参,就以逗号隔开。每个形参都有类型和变量名,其中形参变量名在声明时可以省略。最后以分号结尾,结束声明语句。
如果不想让人看到函数的源码,就可以只提供一个声明和一个编译后的文件,这样别人就只能看汇编码了(笑)。C语言的这个设计,对保护知识产权还是有利的。
函数定义,就是在声明之后不跟分号,而是以大括号表示函数体,把函数的具体代码写在大括号内部。
上图中的main()函数就是定义,printf()函数是声明。
定义,实现的是函数的内容。函数是不能多次定义的,否则编译器不知道采用哪个定义的代码。
但函数可以多次声明,只要声明都是一样的,不互相矛盾。
只要打了两个大括号{},就算定义了函数。空实现也是实现,可以先占住这个位置,以后再填写具体的函数代码。即,先给出整个程序的框架来,然后再填写细节。
在实现了函数之后,必须去调用它,它才会运行。
除了main函数是被shell启动的,其他函数都要直接或间接被main函数调用。
某一个函数在运行时,实际是存在一条从main函数到它的调用链的。
函数调用的语法是:
函数名(实参变量0, 实参变量1);
如果有多个实参,则以逗号隔开。如果要接收函数调用的返回值,可以用一个变量去接收:
返回值变量 = 函数名(实参变量0, 实参变量1);
返回值变量的类型,要与函数的返回值类型一致,(返回值变量)在使用之前要先声明。
对于有返回值的函数,也可以不接收它的返回值。例如,printf()虽然有个int类型的返回值,用于表示打印了多少个字符,但一般不接收它。
所以C语言的入门代码都是printf("hello world\n");
而不是int ret = printf("hello world\n");
函数名,在C语言中属于标志符(identity)。
标志符的命名规则是,以下划线或大小写字母开始,之后可以跟数字、字母、下划线,(但不能跟运算符或其他特殊符号)。
它们在代码中用于表示变量名、结构体类型名、函数名,或者给goto使用的标号。
基本类型的类型名,都被定义为了关键字,不能再用作标志符。
struct S {
int a;
int b;
} s;
S是标志符,表示结构体类型S。
a是标志符,表示结构体的成员变量a。
s是标志符,表示变量s,它的类型是结构体类型S。
函数名,也属于标志符,所以函数名也要以下划线或大小写字母开始,不能是关键字、运算符、或其他特殊符号。
0123,这不能做函数名,C语言的以0开始的数字是八进制数字。
0x123,也不能做函数名,以0x开始的数字是16进制的数字。
main,可以做函数名,这是主函数,在整个程序里只能有一个,不能作为普通函数的名字。
__schele,以下划线开始,可以做函数名。
不过,以两个下划线开始的函数,大多是Linux系统或C库的函数。普通函数最好别这么命名。
char,这不能做函数名,它是字符类型的关键字。
+,这也不能,它是表示加法的运算符。
CreateWindowEx,这可以做函数名,一看就是典型的匈牙利风格,微软的代码(笑)。这个函数是windows系统上创建窗口的API。
匈牙利风格的代码,是从微软开始流行的一种风格,函数名以一个或多个英文单词命名,每个单词的首字母大写,其他字母小写。
不过Linux的代码(包括第三方的软件),还是保持上古C代码的那种下划线风格,全部字母小写,单词之间以下划线分割,而且多使用缩写。
有时候,缩写之后只剩下几个字母,就直接新组一个词当函数名了。
例如,Linux上启动新程序的函数execve(),就是个缩写的单词。
执行的英文单词叫execute,windows上的可执行程序叫exe文件,就是这个词的前3个字母,Linux也选了这三个字母。
cve这三个字母,来自完整的main函数的参数列表:
int main(int argc, char* argv[], char* envp);
main函数的完整声明是上面这个样子的,int main()这个是简化版的。
其中第一个参数argc,表示要传给main函数的参数个数。通过命令行参数的形式传递。arg是参数argument的缩写,c就是count,即参数个数。
argv,是(传给main函数的)参数字符串的数组,v指的是vector。
envp,是环境变量的路径,environment path。
所以,启动main的系统调用就叫作execve()了,而不叫StartProgram()。
虽然后者明显容易理解,但它字母多啊,系统调用的API哪能让人一眼就看出来是启动进程的呢(汗)。
回到开头,main()函数在Linux上就是被execve()这个API启动的,然后其他函数要被main函数直接或间接调用。
不被main函数(直接或间接)调用的函数,并不会运行。
上图的代码只会打印add,因为main只调用了add()函数,没有调用sub()函数。
这段简单的代码,只有这三个函数,sub()没有被调用。
热心网友
时间:2022-04-23 23:39
如果有函数声明的话,函数声明应该尽量靠前,在所有调用该声明的代码段之前。函数定义则可以在后面按喜好摆放。
如果没有函数声明的话,就得把函数定义放到所有调用该函数的代码段之前。
函数声明与函数定义分别在程序中的什么位置?为什么?
函数定义,就是在声明之后不跟分号,而是以大括号表示函数体,把函数的具体代码写在大括号内部。上图中的main()函数就是定义,printf()函数是声明。定义,实现的是函数的内容。函数是不能多次定义的,否则编译器不知道采用哪个定义的代码。但函数可以多次声明,只要声明都是一样的,不互相矛盾。只要打了...
C++中,函数的声明与函数的定义有什么区别?
函数的声明与函数的定义的区别:声明:一般在头文件里,对编译器说:这里我有一个函数叫function() 让编译器知道这个函数的存在。定义:一般在源文件里,具体就是函数的实现过程 写明函数体。你还可以这样理解:首先下图中的程序执行时,电脑是从上到下执行的。也就是说假如没有函数的声明那一句,当...
在C语言中,函数定义跟函数声明有什么区别有什么不同之出?
声明就象是定义的头部,比较简略,函数是用来调用的,如果函数定义部写到调用的位置后面,执行到调用位置,
C++中对自定义函数的声明,放main内还是外,在含类的程序中,貌似只能在...
一般放在函数外,调用之前。放在哪跟有类没类没有直接联系。实践中一般将函数声明、类的定义放在头文件中。而定义放在单独的源文件(.cpp)。如果有哪个源文件中用到了头文件中声明的函数或类,只需#include “***.h”将头文件包含进来。
C语言 函数定义 函数声明 区别
楼主可以这样想,C语言中,无论是常量,变量,函数,只有先定义才能使用的。在函数定义时,大脑要往一般的常量,变量定义的方向,切忌先不要想函数的别的。定义好后,把函数的定义先放一边,不管它。接着是函数声明,大家都知道,C语言是有一个主函数main()和0或n个普通函数组成的。由于当代码越长...
C语言中函数什么时候声明?什么时候定义?最好举例说明。
函数可以在调用函数的函数(比如main函数)之前定义,这样就无需声明了;举例:int add(int x,int y) { return x+y; } //在编译程序编译到main的调用add之处时,由于已经编译过add的函数了,因此编译程序已经知晓调用规则,因此可以省略声明语句void main() { int x=5,y=6,c; c=add(x,y);...
.h文件中只是函数的声明,而函数的定义在哪呢?
标准库的代码都是被编译好的库,通过头文件给出定义,让你可以使用,你编译程序的时候,连接器会把库中的代码连接进来。想知道函数怎么用就要查手册。后面两句,确切的说是三句是用来避免重复包含的,一般这样写 ifndef abcde define abcde ...//一些定义 endif 如果你这个文件没被包含过,那么abcde...
函数声明与函数定义的区别
声明与定义的区别:函数的声明与函数的定义形式上十分相似,但是二者有着本质上的不同。声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点空间。定义则需要开辟内存。函数的定义 函数的定义是一个完整的函数单元,包含函数类型、函数名、形参及形参类型、函数体等。在程序中,函数的定义...
“函数定义” 在 “主函数” 之前,为什么使用时,可以不用 “函数声明...
因为程序在编译的时候是自上而下扫描文件的,函数在调用以前必须有函数原型,编译器才知道怎么编译。对于主函数中调用的函数,如果在在主函数前定义或者声明原型,则编译器就知道如何调用了。
c语言写函数是写在主程序前面好还是先声明然后写在主程序后面好呢 各有...
main函数放在最前面,结构条例比较清晰,读起来方便,先main,然后main调用的其他函数。这样的话就需要在main前声明被调函数。代价就是如果被调函数发生变化,譬如函数名称、参数、返回值类型等发生变化,那么声明的地方也要同步改变。如果是被调函数在main函数之前,就没这个问题,但读起来就要先找到main函数...