函数(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;
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐