这是一个非常基础且重要的概念。void foo 声明了一个名为 foo 的函数,这个函数不接受任何参数,并且不返回任何值。

下面我们把它拆开来看,并深入探讨它的用法和细节。
关键词分解
void
void 是 C 语言中的一个特殊关键字,字面意思是“空的”、“无类型”,它主要有两种用途:
- 用作函数的返回类型:当
void 用在函数名前面时,表示这个函数执行完毕后,不会向调用者返回任何值。
- 用作函数的参数列表:当
void 用在函数的括号 内时,表示这个函数不接受任何参数。
foo
foo 是函数的名称,在 C 语言中,函数名需要遵循标识符的命名规则(通常以字母或下划线开头,后跟字母、数字或下划线)。foo 是一个非常常见的、用于示例的函数名,就像 bar、baz 一样,没有特殊含义,只是用来代表一个函数。
void foo 的完整含义
将它们组合起来,void foo 的完整含义是:
(图片来源网络,侵删)
- 返回类型:
void -> 函数不返回任何值。
- 函数名:
foo -> 函数的名称是 foo。
- 参数列表: (空括号) -> 函数不接受任何参数。
void foo 是一个无参数、无返回值的函数。
代码示例
下面是一个完整的、可运行的 C 程序,展示了如何声明、定义和调用 void foo。
#include <stdio.h>
// 1. 函数声明 (可选,但推荐)
// 告诉编译器存在一个名为 foo 的函数,它没有参数,也不返回值。
void foo();
// 2. 函数定义
// 这才是函数的实际实现。
void foo() {
// 函数体
// 由于返回类型是 void,函数内部不能使用 return value; 这样的语句。
// 但可以使用不带值的 return; 来提前结束函数执行(在复杂逻辑中很有用)。
printf("Hello, I am the function foo!\n");
printf("I don't take any arguments and I don't return anything.\n");
}
// 3. 主函数 - 程序的入口点
int main() {
printf("Before calling foo().\n");
// 4. 函数调用
// 调用 foo 函数,不需要传递任何参数,也不需要接收任何返回值。
foo();
printf("After calling foo().\n");
// main 函数的返回类型是 int,所以需要返回一个整数
return 0;
}
编译和运行结果:
gcc your_file_name.c -o your_program_name
./your_program_name
输出:
(图片来源网络,侵删)
Before calling foo().
Hello, I am the function foo!
I don't take any arguments and I don't return anything.
After calling foo().
重要细节和常见问题
问题 1:void foo() 和 void foo(void) 有什么区别?
在 C 语言中,这两者有细微但重要的区别,尤其是在函数声明中。
-
void foo() (K&R 风格)
-
含义:声明一个名为 foo 的函数,它不接受固定数量的参数,这意味着你可以用任意数量的参数来调用它,编译器不会报错(尽管这通常是错误的)。
-
历史:这是 C 语言早期(K&R C)的风格,现在被认为是不安全和过时的。
-
示例:
void foo(); // 声明
void foo() { /* ... */ } // 定义
// 下面这些调用在 K&R 风格下可能不会产生编译错误,但逻辑上是错误的
foo(); // 正确调用
foo(1); // 可能不报错,但错误
foo("hello"); // 可能不报错,但错误
-
void foo(void) (现代 C 风格)
-
含义:明确声明一个名为 foo 的函数,它不接受任何参数,如果你尝试用任何参数调用它,编译器会报错。
-
推荐:这是现代 C 标准 (C89 及以后)推荐的、更安全、更清晰的方式,它消除了所有歧义。
-
示例:
void foo(void); // 声明
void foo(void) { /* ... */ } // 定义
foo(); // 正确调用
foo(1); // 编译器会报错:too many arguments to function 'foo'
foo("hello"); // 编译器会报错:too many arguments to function 'foo'
永远使用 void foo(void) 来表示一个无参数函数,这是现代 C 编程的最佳实践。
问题 2:既然不返回值,为什么还要用 return;?
在 void 函数中,return; 语句的作用不是返回一个值,而是立即终止当前函数的执行,并将控制权交还给调用者。
这在复杂的函数中非常有用,
void print_positive_number(int num) {
if (num <= 0) {
// 如果数字不是正数,就什么都不打印,直接退出函数
return;
}
printf("The positive number is: %d\n", num);
}
问题 3:void 函数的常见用途
void 函数在 C 中非常普遍,通常用于执行一些“动作”或“副作用”,而不是计算并返回一个结果。
- 打印信息:如上面的
printf 示例。
- 修改全局变量或静态变量。
- 执行 I/O 操作:如读写文件、网络通信。
- 排序或修改数组:函数接收数组作为参数,直接在原数组上进行修改,而不是返回一个新数组。
- 初始化操作:在程序启动时执行一些设置工作。
特性
描述
语法
void foo(void); (声明)
void foo(void) { ... } (定义)
返回类型
void - 函数不返回任何值,在函数体内不能使用 return value;。
参数列表
void - 函数不接受任何参数,调用时不能传递任何参数。
最佳实践
始终使用 void foo(void) 而不是 void foo() 来明确表示无参数,以避免歧义和潜在错误。
调用方式
直接使用函数名 foo(); 即可。
主要用途
用于执行操作、产生副作用(如打印、修改外部状态),而不是计算结果。
void 是 C 语言中的一个特殊关键字,字面意思是“空的”、“无类型”,它主要有两种用途:
- 用作函数的返回类型:当
void用在函数名前面时,表示这个函数执行完毕后,不会向调用者返回任何值。 - 用作函数的参数列表:当
void用在函数的括号 内时,表示这个函数不接受任何参数。
foo
foo 是函数的名称,在 C 语言中,函数名需要遵循标识符的命名规则(通常以字母或下划线开头,后跟字母、数字或下划线)。foo 是一个非常常见的、用于示例的函数名,就像 bar、baz 一样,没有特殊含义,只是用来代表一个函数。
void foo 的完整含义
将它们组合起来,void foo 的完整含义是:

- 返回类型:
void-> 函数不返回任何值。 - 函数名:
foo-> 函数的名称是foo。 - 参数列表: (空括号) -> 函数不接受任何参数。
void foo 是一个无参数、无返回值的函数。
代码示例
下面是一个完整的、可运行的 C 程序,展示了如何声明、定义和调用 void foo。
#include <stdio.h>
// 1. 函数声明 (可选,但推荐)
// 告诉编译器存在一个名为 foo 的函数,它没有参数,也不返回值。
void foo();
// 2. 函数定义
// 这才是函数的实际实现。
void foo() {
// 函数体
// 由于返回类型是 void,函数内部不能使用 return value; 这样的语句。
// 但可以使用不带值的 return; 来提前结束函数执行(在复杂逻辑中很有用)。
printf("Hello, I am the function foo!\n");
printf("I don't take any arguments and I don't return anything.\n");
}
// 3. 主函数 - 程序的入口点
int main() {
printf("Before calling foo().\n");
// 4. 函数调用
// 调用 foo 函数,不需要传递任何参数,也不需要接收任何返回值。
foo();
printf("After calling foo().\n");
// main 函数的返回类型是 int,所以需要返回一个整数
return 0;
}
编译和运行结果:
gcc your_file_name.c -o your_program_name ./your_program_name
输出:

Before calling foo().
Hello, I am the function foo!
I don't take any arguments and I don't return anything.
After calling foo().
重要细节和常见问题
问题 1:void foo() 和 void foo(void) 有什么区别?
在 C 语言中,这两者有细微但重要的区别,尤其是在函数声明中。
-
void foo()(K&R 风格)-
含义:声明一个名为
foo的函数,它不接受固定数量的参数,这意味着你可以用任意数量的参数来调用它,编译器不会报错(尽管这通常是错误的)。 -
历史:这是 C 语言早期(K&R C)的风格,现在被认为是不安全和过时的。
-
示例:
void foo(); // 声明 void foo() { /* ... */ } // 定义 // 下面这些调用在 K&R 风格下可能不会产生编译错误,但逻辑上是错误的 foo(); // 正确调用 foo(1); // 可能不报错,但错误 foo("hello"); // 可能不报错,但错误
-
-
void foo(void)(现代 C 风格)-
含义:明确声明一个名为
foo的函数,它不接受任何参数,如果你尝试用任何参数调用它,编译器会报错。 -
推荐:这是现代 C 标准 (C89 及以后)推荐的、更安全、更清晰的方式,它消除了所有歧义。
-
示例:
void foo(void); // 声明 void foo(void) { /* ... */ } // 定义 foo(); // 正确调用 foo(1); // 编译器会报错:too many arguments to function 'foo' foo("hello"); // 编译器会报错:too many arguments to function 'foo'
-
永远使用 void foo(void) 来表示一个无参数函数,这是现代 C 编程的最佳实践。
问题 2:既然不返回值,为什么还要用 return;?
在 void 函数中,return; 语句的作用不是返回一个值,而是立即终止当前函数的执行,并将控制权交还给调用者。
这在复杂的函数中非常有用,
void print_positive_number(int num) {
if (num <= 0) {
// 如果数字不是正数,就什么都不打印,直接退出函数
return;
}
printf("The positive number is: %d\n", num);
}
问题 3:void 函数的常见用途
void 函数在 C 中非常普遍,通常用于执行一些“动作”或“副作用”,而不是计算并返回一个结果。
- 打印信息:如上面的
printf示例。 - 修改全局变量或静态变量。
- 执行 I/O 操作:如读写文件、网络通信。
- 排序或修改数组:函数接收数组作为参数,直接在原数组上进行修改,而不是返回一个新数组。
- 初始化操作:在程序启动时执行一些设置工作。
| 特性 | 描述 |
|---|---|
| 语法 | void foo(void); (声明) void foo(void) { ... } (定义) |
| 返回类型 | void - 函数不返回任何值,在函数体内不能使用 return value;。 |
| 参数列表 | void - 函数不接受任何参数,调用时不能传递任何参数。 |
| 最佳实践 | 始终使用 void foo(void) 而不是 void foo() 来明确表示无参数,以避免歧义和潜在错误。 |
| 调用方式 | 直接使用函数名 foo(); 即可。 |
| 主要用途 | 用于执行操作、产生副作用(如打印、修改外部状态),而不是计算结果。 |
