# 前言
该系列文章适合于一些有开发经验却不太懂 C 的程序员,比如大部分的 php 程序员。一些常规的名词(比如参数、函数、返回值)和一些通用的语法(比如 `if else`、`for 循环`等)不再任何说明和解释,大家自行搜索即可。
我希望我的这个系列的博客能帮大家对 C 语言基础做到一个穿针引线的作用,让大家能够上手 C 语言的开发,比如 php 程序员开发 php 扩展。
# 实验
新建文件`test1.c`
```c
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("%s\n", "1111");
return 0;
}
```
# 编译
```c
zhoumengkang@bogon:~/Downloads$ gcc test1.c -o test1
```
# 执行
```javascript
zhoumengkang@bogon:~/Downloads$ ./test1
1111
```
# 总结
我们从上往下看,有两个知识点需要学习。
## 头文件
我们发现我们在最开始使用了`#include <stdio.h>`这个文件,这是因为我们在使用的`printf`函数是在`stdio.h`里面定义的。我们可以通过
```sh
man 3 printf
```
来查阅
```sh
PRINTF(3) Linux Programmer's Manual PRINTF(3)
NAME
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf,
vsnprintf - formatted output conversion
SYNOPSIS
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
```
如上所示,也就是说在使用这四个打印函数的时候都需要包含`<stdio.h>`。
### 认识 man 命令
顺便说下为什么是`man 3`,因为`man`查看手册的时候是分章节的,章节列表
章节编号|章节名称|章节主要内容
-----|----|----
1|General Commands|用户在shell中可以操作的指令或者可执行文档
2|System Calls|系统调用的函数与工具等
3|Sunroutines|C语言库函数
4|Special Files|设备或者特殊文件
5|File Formats|文件格式与规则
6|Games|游戏及其他
7|Macros and Conventions|表示宏、包及其他杂项
8|Maintenence Commands|表示系统管理员相关的命令
如果我输入的是
```sh
man printf
```
出来的结果和`man 1 printf`一样,查的是 shell 命令里面的`printf`
```
PRINTF(1) User Commands PRINTF(1)
NAME
printf - format and print data
SYNOPSIS
printf FORMAT [ARGUMENT]...
printf OPTION
...
```
man 是按照手册的章节号的顺序进行搜索的,所以我们在查C语言库函数的时候,记得使用`man 3 xxx`
## main 函数
main 函数是整个程序的入口,所以编译一个项目,main 函数有且仅有有几个。
> https://www.zhihu.com/question/28360770
> main函数就是这个约定好的用户代码默认入口。
> 当然,只要你愿意,改成啥都行。比如你改成nomain,那么编译链接时就要指定入口了(同时指定不链接CRT的入口代码)。
```c
#include <stdio.h>
#include <stdlib.h>
int nomain(int argc, char const *argv[])
{
printf("%s\n", "1111");
exit(0);
}
```
```sh
gcc xxx.c -e nomain -nostartfiles
```