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; }