一、编译的过程

编译流程:-o 给生成的文件取别名,默认名字叫a.exe/a.out
    预处理:gcc -E
        1、展开头文件
        2、删除注释
        3、替换宏
        4、宏分支
        # 预处理符
    编译:gcc -S
        将C语言代码变成汇编语言(检查语法)  .s
    汇编:gcc -c
        将汇编语言转化为机器码(二进制 .obj)
    链接:gcc
        1、将多个二进制文件打包成一个可执行文件
        2、链接库、链接函数

※可以直接一步完成以上四个步骤:gcc code.c -o code

二、main函数

1、概念

每个C语言程序不管有多少行代码,都是从main()函数开始执行的,main()函数是程
序的入口,main 函数也被叫做主函数

      ①main()函数是程序的入口;

      ②main()函数有且仅有一个;

2、main()的两种形式

①无参数形式 int main(void) /* 无参数形式 */
{
    ... return 0;
}
②有参数形式 int main(int argc, char *argv[]) /* 带参数形式 */
{
    ... return 0;
}

三、头文件

.c文件:
           名称:源文件(Source file)
           作用:.c文件包含程序的主要实现代码,是程序的源代码文件
.h文件:
           名称:头文件(Header file)
           作用:.h文件通常包含函数的声明(即函数原型)、宏定义、结构体定义、全局变量                         声明以及其他需要在多个源文件中共享的内容。

1、头文件的类型

①#include <stdio.h> // 包含标准输入输出库

②#include <stdlib.h> // 包含标准库函数

③#include "cdemo.h" // 包含项目自定义的头文件

2、为什么需要头文件?

1、硬件和计算资源限制
2、操作系统工具链设计特点
3、模块化开发和增量编译
4、代码重用
5、避免重复定义
6、提供抽象和封装

3、标准库

C语言的标准库(Standard Library)提供了一组广泛使用的函数,涵盖输入输出处理、字符串操作、数学运算、内存管理等功能。这些库在编写C程序时非常实用。以下是一些常用的C标准库及其功能:

1. <stdio.h> - Standard Input and Output
功能:提供输入输出函数,如读写文件、控制台输入输出等。
常用函数:
printf():格式化输出到控制台。
scanf():格式化输入,从标准输入读取数据。
fopen():打开文件。
fclose():关闭文件。
fread():从文件中读取数据。
fwrite():将数据写入文件。
fprintf():格式化输出到文件
fscanf():格式化输入,从文件读取数据
fseek():移动文件指针。
ftell():获取文件指针的位置
2. <stdlib.h> - Standard Library
功能:提供通用的工具函数,包括内存管理、随机数生成、程序退出控制等。
常用函数:
malloc():分配内存
free():释放内存。
realloc():重新分配内存。
calloc():分配并清零内存。
exit():终止程序执行。
atoi():将字符串转换为整数。
atof():将字符串转换为浮点数。
rand():生成随机数
srand():设置随机数种子
3. <string.h> - String Handling
功能:提供字符串操作函数,如字符串复制、拼接、比较等。
常用函数:
strcpy():复制字符串。
strncpy():复制指定长度的字符串。
strcat():拼接字符串。
strncat():拼接指定长度的字符串。
strlen():计算字符串长度。
strcmp():比较两个字符串。
strncmp():比较指定长度的字符串。
strchr():查找字符在字符串中的第一次出现。
strstr():查找子串在字符串中的第一次出现。
memcpy():复制内存块。
memset():设置内存块
4. <math.h> - Mathematics Library
功能:提供数学运算函数,如三角函数、指数函数、对数函数等。
常用函数:
sin():计算正弦值。
cos():计算余弦值。
tan():计算正切值。
exp():计算指数值。
log():计算自然对数。
log10():计算以10为底的对数。
sqrt():计算平方根。
pow():计算幂值。
fabs():计算绝对值。
ceil():向上取整。
floor():向下取整。

四、多文件编译

1、 编译并链接所有 .c 文件到一个可执行文件
如果你有多个 .c 文件,比如 file1.c 和 file2.c,你可以使用以下命令编译并链接它们到一个可执行文件 program.exe:
                                      gcc file1.c file2.c -o program.exe
这里,gcc 会自动将所有列出的 .c 文件编译成目标文件(.o 文件),然后将这些目标文件链接成一个可执行文件 program。
2.、单独编译成目标文件,然后链接
你也可以先编译每个 .c 文件生成目标文件(.o 文件),然后再将这些目标文件链接成一个可执行文件,这样做可以更方便地在多个文件间进行增量编译。
首先编译每个 .c 文件:
gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
然后将所有目标文件链接成一个可执行文件:
gcc file1.o file2.o -o program.exe

五、代码格式

在编写 C 语言程序时,遵循一定的代码格式和规范可以提高代码的可读性、可维护性和可移植性。
1、代码缩进
一致性: 使用一致的缩进风格(通常是 4 个空格或 1 个制表符)。保持缩进的一致性有助于提高代码的可读性。
块结构: 在代码块的开头和结尾使用大括号 {},并将大括号放在相应的行上(或者与条件语句同一行)。
2、 命名规范
变量名: 选择具有描述性的变量名,使用小写字母和下划线分隔词(例如 max_value)。
函数名: 使用动词加名词的形式(例如 calculate_sum),并保持一致性。
常量名: 使用全大写字母和下划线分隔词(例如 MAX_SIZE)
3、注释
文档注释: 在函数定义之前添加简要的文档注释,描述函数的功能、参数和返回值。
行内注释: 用于解释复杂的代码或算法,但应尽量避免过多注释,保持代码自解释性。
4、代码结构
函数: 每个函数应尽量保持简洁,执行单一的功能。函数的定义应该清晰地表达其功能。
文件分隔: 将相关的函数和数据组织在一起,并将它们分隔到不同的源文件(.c 文件)和头                     文件(.h文件)中。
头文件保护: 使用宏定义来防止头文件被多次包含
5、函数原型
声明: 在 .h 文件中声明函数原型,在 .c 文件中定义函数;
6、错误处理
返回值检查: 对函数调用的返回值进行检查,确保程序的健壮性;
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int result = some_function();
    if (result < 0)
    {
        perror("some_function failde"); // 打印错误原因
        exit(EXIT_FAILURE); // 直接退出程序
    }
    return 0;
}
7、代码风格
避免魔法数字: 使用常量定义代替硬编码的数字,以提高代码的可维护性
#define MAX_SIZE 100
int array[MAX_SIZE];
8、内存管理
释放内存: 动态分配的内存需要在不再使用时释放,以防止内存泄漏;
int *ptr = (int *)malloc(10 * sizeof(int));
// 使用 ptr
free(ptr);
10. 避免未初始化的变量
初始化变量: 在使用变量之前,确保它们被初始化;

六、注释

1、单行注释

单行注释用于对单行代码进行简短的注释,开始于 // 符号。// 后面的所有内容直到行末都被视为注释;
int x = 5;//这是一个整数变量

2、多行注释

多行注释用于注释多行代码,开始于 /*,结束于 */。多行注释可以跨越多行,适用于较长的说明或暂时禁用大块代码。
/*
这是一个多行注释
它可以跨越多行
用于提供详细的解释或文档
*/
Logo

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

更多推荐