问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

函数声明与函数定义分别在程序中的什么位置?为什么?

发布网友 发布时间: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函数...

函数定义和声明的区别 函数原型和函数声明的区别 c语言函数定义与声明 函数定义和声明 函数可以重复声明和定义嘛 c语言函数的定义 以下正确的函数定义形式是 函数的定义和调用 函数必须声明
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在液压原理图中各种符号的表示意义是什么? 脚臭怎么办,一脱鞋,那味道我自己都受不了? ...经电加热后表面会形成一层黑色物质,请问是什么东西?用什么化学... 宿舍老是经常出现蚂蚁,放久的书本打开全是蚂蚁,或是布柜里放久的衣服... 为什么寝室地板上会有蚂蚁? 怎么计算产值excel 青春不再伤感经典句子(《青春伤感经典短句子》) 致我们失去的青春简短说说(怀念过去的经典句子) 分享回忆过去致青春的语录集锦(回忆的句子时光感言简短) 女生为什么总想摸我的脸 C语言程序中什么是函数 在C语言中,一个函数一般由两个部分组成,它们是——和—— 求科普什么是函数式编程语言 C语言编程中的函数是哪些函数 华为p20现在怎么样了 华为p20如何 华为P20系列怎么样 华为p20到底怎么样 华为P20究竟怎么样 华为p20怎么样 好用吗 怎么起名字姓邓 帮忙给姓邓的女孩,起一个什么都好的名字。 姓邓的邓起源于哪个朝代? 我姓邓 想给孩子起个名字 男孩 我想给孩子起个名字,姓邓 姓邓男孩起名字大全 给孩子起个好名字,姓邓!!! 姓邓男孩起名字 姓邓起什么名字 姓邓的起什么名字好听 C语言中怎样调用函数(举个例子) C语言编程函数 学编程语言会用到函数吗 C语言编程,函数 编程语言所用的的函数介绍 C语言编程中的函数调用问题 c程序语言中,为何要调用函数?函数的作用是什么 【计算机专业向】编程语言中“函数”的本质是什么? 关于C语言中的函数 totaldata 是什么编程语言里面的函数? sub在c语言中是什么意思? 重庆江津区有哪些旅游景点呢?分别是哪几个呢? 江津旅游景点排名 重庆江津有哪些好玩的地方? 江津有什么好玩的地方?哪些景点必去? 重庆江津有哪些好玩的地方 江津旅游景点有哪些? 江津区周围那些地方好耍些 重庆江津有什么好玩好看的地方? 江津主城有什么好玩的