C语言函数入门必修课:定义与声明
函数(function)是完成特定任务的独立程序代码单元,是程序的基本模块。在C语言中,其启动的入口就是main函数。另外把系统实现拆分成多个函数,每个函数完成一个功能,然后通过调用函数,实现最终应用。
函数定义
函数定义格式如下所示。
// 函数定义格式
return_type function_name(parameter_list) {
// 代码块
return value;
}
// 举例说明,函数定义
// 函数定义,计算两个整数的和
int sum(int a, int b) {
return a + b;
}
对于函数来说,有以下几个重要的概念。
对于函数来说,使用函数名可以调用函数;函数名在调用时,会根据参数列表使用圆括号传递参数值。
#include
int add(int a, int b) {
return a + b;
}
// 函数调用示例
int main(int argc, char *argv[])
{
int sum = 0;
sum = add(1, 2);
printf("sum = %d\n", sum);
return 0;
}
函数定义中,参数列表为空时,可以省略void,也可以声明为void。
// 函数定义,没有参数,没有返回值
void print_hello(void) {
printf("hello world\n");
}
// 参数列表为空时,也可以省略void
void print_hello() {
printf("hello world\n");
}
虽然省略也能被编译通过,这并非标准C的语法,会导致代码可读性降低,不建议这么使用。对于没有返回值的函数,也可以使用return语句来实现提前函数结束,只是不能够带返回值。
// 函数定义,没有参数,没有返回值
void over_num(int num) {
if (num > 10) {
return; // 提前结束函数, 不带返回值
}
printf("num = %d\n", num);
}
在这里还要说下特殊的函数:main函数。main函数是C语言程序规定的入口函数,每个C语言程序,必须且只包含一个main函数,对于main函数,其实可以写成多个形态,不过C标准文档中,提供的写法如下所示。
// 无参数,返回值int
int main(void)
// 带两个参数,返回值int
int main(int argc, char *argv[])
第一种比较好理解,就是函数定义,返回值int,参数列表为空。第二种写法中,两个参数的含义如下所示。
这是因为C语言支持的软件,往往需要从命令行参数中获取参数值,类似"program_name arg1 arg2 arg3"格式,如"ls -alF"等,其中"-alF"为参数值,"program_name"为程序名,argc和argv分别表示参数个数和参数值。
对于参数的解析,通常会使用getopt函数来解析命令行参数,使用方法如下所示。
#include
#include
#include
int main(int argc, char *argv[])
{
int opt;
while ((opt = getopt(argc, argv, "d:vh")) != -1) {
switch (opt) {
case 'd':
printf("opt = %c, optarg = %s\n", opt, optarg);
break;
case 'v':
printf("opt = %c\n", opt);
break;
case 'h':
printf("opt = %c\n", opt);
break;
default:
printf("opt = %c\n", opt);
break;
}
}
return 0;
}
其中"d:vh"对应支持的配置项和参数,对于选项和后面字符的含义如下所示。
至于返回值,则表示函数执行完成后返回的结果值,保存在系统的errno变量中,可以用于后续分析。通常来说,本人更习惯使用第二种方法,至于没有返回值的版本、不带参数的版本,不一定编译执行有问题,但不是标准的main函数声明,这里不建议使用。
函数声明
在调用函数之前,需要先声明函数;不过对于函数定义在调用之前,也可以省略函数声明。
关于函数声明,格式如下所示。
// 函数声明格式
return_type function_name(parameter_list);
// 举例说明,函数声明
// 函数声明,计算两个整数的和
int add(int a, int b);
可以看到,函数的声明格式与定义格式类似,只是没有函数体,只有返回值类型、函数名和参数列表。对于函数声明来说,可以通过static和extern关键字来修饰函数,具有不同的含义。
关于静态函数和外部函数,具体示例如下所示。
// 函数声明,只能被当前源文件调用
static int internal_add(int a, int b);
// 函数声明,主要在其它源文件中调用时声明
extern int external_add(int a, int b);
在函数声明时,可以省略参数名,仅需要参数类型和参数数量即可。语法虽然支持,不过在实践中还是建议还是保留参数名,增加代码可读性;
关于函数声明具体示例如下所示。
#include
// 函数声明,省略参数名
// 不省略形式,int add(int a, int b);
int add(int, int);
// 函数调用示例
int main(int argc, char *argv[])
{
int sum = 0;
sum = add(1, 2);
printf("sum = %d\n", sum);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)