C 程序结构
更新时间:2026-08-26。本文是
languages/c/主题入门层第 3 篇。上一篇把工具链理顺了,这一篇看程序本身的"骨架":一段 C 代码由什么组成、怎么组织。别看这些是碎规则,它们解释了"为什么别人的代码读起来顺、你的报错一堆"。
本文要回答的问题
- 一个 C 程序的最小结构是什么?
main为什么特殊? - 分号忘写会怎样?
{}是干什么的? - 注释怎么写才不算"写了等于没写"?
一、最小程序长什么样
#include <stdio.h>
int main(void) {
return 0;
}三件套,缺一不可:
| 部件 | 作用 |
|---|---|
#include <stdio.h> | 引入标准输入输出库的声明(printf 等函数) |
int main(void) | 程序入口,操作系统从这里开始执行 |
return 0; | 告诉系统"我正常结束了" |
main 的 void 参数表示"不接受命令行参数"。想接收参数时写 int main(int argc, char *argv[]),那是返回值与命令行参数的内容,入门先记 void 就行。
二、#include 是什么
#include <stdio.h> 这行在预处理阶段就被处理了:编译器把这行替换成 stdio.h 文件的全部内容,于是 printf 的声明就"贴"进了你的源文件。你可以把它想成"把这个文件的内容粘贴到这里"。
- 尖括号
<>:去系统标准目录找头文件(如/usr/include/); - 双引号
"":先找当前目录,再找系统目录,用于自己的头文件(如"calc.h")。
这一行不写,用 printf 会报 implicit declaration of function 'printf'——就是"我没见过这个函数"的意思。
三、注释:给自己和别人的便签
C 有两种注释:
// 单行注释:到行尾结束,最常用
/*
* 多行注释:
* 以 /* 开始,到 */ 结束
* 适合写函数说明、版权头
*/几条实用建议:
- 写"为什么",不写"是什么"。
x = x + 1; // 计数器加一是废话;x = x + 1; // 因为函数返回后计数会重置,这里手动补偿才有价值; - 代码改完,注释同步改。过期的注释比没有注释更坑人——它理直气壮地撒谎;
- 多行注释不能嵌套:
/* /* */在第一个*/就结束了,第二个*/会报错。
四、分号:语句的句号
C 里每条语句以分号结尾。分号忘写,编译器会"吞"掉下一行继续读,报错往往出现在下一行,位置很迷惑:
int a = 1;
int b = 2; // 如果上一行忘写分号,错误会报在这里新手最崩溃的时刻之一就是"错误指向的行明明是好的"。记住:编译错误报在哪一行,不代表错在哪一行,往上看两行。
但注意,不以分号结尾的东西也不少:if 的条件、for 的括号、函数定义的花括号、#include 行——这些规则后面逐一展开,先有个印象:分号是语句的句号,不是"每行的句号"。
五、语句块:用 {} 圈住一组语句
int main(void) {
int a = 1;
int b = 2;
{
int c = 3; // 这个块里声明的变量,块外不可见
printf("%d\n", a + b + c);
}
// printf("%d\n", c); // 错误!c 在块外不存在
return 0;
}{} 做两件事:把多条语句组成一个整体(if/for/函数体的标配),划定变量作用域(块内声明的变量块外不可见)。作用域的完整规则见作用域与生命周期。
一个 C 特色:空语句块 {} 合法但常是 bug 的温床:
if (a > b) {
// 空的!可能是想写却没写
}六、常见结构错误对照
| 错误 | 典型报错 | 原因 |
|---|---|---|
| 忘写分号 | 报错在下一行 | 语句没以 ; 结尾 |
main 拼错 / 没写 | undefined reference to 'main' | 入口缺失 |
| 括号不配对 | expected '}' before ... | 花括号 / 圆括号数量不对称 |
忘写 #include | implicit declaration of function | printf 声明没进来 |
写代码时写完一组括号先补右括号,再往里面填内容——能避免大量配平错误。
七、与本站主线衔接
main之前发生了什么(启动代码、装载),见 L5 ELF 与装载;- 函数调用时栈帧怎么搭,见专家层 内存布局与 ABI;
- 预处理阶段
#include展开的细节,见预处理、宏与调试。
一句话总结
C 程序 = #include(引入声明)+ main(唯一入口)+ 若干以分号结尾的语句;注释写"为什么"、{} 圈语句也圈作用域、忘分号时往上看两行找错——骨架立住了,往里填东西才有底气。