【让你从0到1学会c语言】程序环境和预处理指令(一)

简介: 【让你从0到1学会c语言】程序环境和预处理指令(一)

作者:喜欢猫咪的的程序员

专栏:《C语言》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》

目录

程序的翻译环境和执行环境:

4个过程的介绍:

编译过程中各个阶段实现的事情:

预处理详解:

预定义符号:

#define :

#define 定义标识符

#define 定义宏

宏的申明方式:

宏存在的一些问题:

#define 替换规则

#和##

宏和函数对比

命名规定:

#undef

条件编译:

常见的条件编译指令:

文件包含

本地文件包含

库文件包含


程序的翻译环境和执行环境:

在ANSI C的任何一种实现中,存在两个不同的环境。


  • 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
  • 第2种是执行环境,它用于实际执行代码

编译一个C语言程序是一个多阶段的过程。从总体上看,这个过程可以分成四个独立的阶段。预处理、编译、汇编和连接


我们先来看看这4个过程的流程图:

4个过程的介绍:

1.一个文件经过编译器生成对应的目标文件

2.多个目标文件与链接库一起生成链接器,最终生成可执行程序。(编译过程


编译过程中各个阶段实现的事情:

我们先来了解一下编译过程中各个阶段的操作指令:


1. 预处理 选项 gcc -E test.c -o test.i

预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。

2. 编译 选项 gcc -S test.c

编译完成之后就停下来,结果保存在test.s中。

3. 汇编 gcc -c test.c

汇编完成之后就停下来,结果保存在test.o中。


我们可以通过上述的各个指令来观察各个阶段。


下图是各个阶段会做的事情以及操作指令:



预处理详解:


预定义符号:

这些预定义符号都是语言内置的。

以上预定义符号如何使用呢?

参考下图:

 

#define :

#define 定义标识符

语法:

#define name stuff

stuff 只要合法都可以,数字 字符串甚至是一串代码

运用如下:


#define 定义宏


宏的申明方式:

#define name( parament-list ) stuff

其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中


注意:

参数列表的左括号必须与name紧邻。

如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

如何运用如下:



宏存在的一些问题:

注意:能加括号尽量加括号,避免出现歧义,造成错误。


避免出现下面这种情况:


#define 替换规则

我们都知道 #define会替换,那他替换有什么原则吗?如下:



相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
1月前
|
编译器 C语言
C语言--预处理详解(1)
【10月更文挑战第3天】
|
1月前
|
编译器 Linux C语言
C语言--预处理详解(3)
【10月更文挑战第3天】
|
17天前
|
C语言
【c语言】你绝对没见过的预处理技巧
本文介绍了C语言中预处理(预编译)的相关知识和指令,包括预定义符号、`#define`定义常量和宏、宏与函数的对比、`#`和`##`操作符、`#undef`撤销宏定义、条件编译以及头文件的包含方式。通过具体示例详细解释了各指令的使用方法和注意事项,帮助读者更好地理解和应用预处理技术。
20 2
|
1月前
|
C语言
C语言--预处理详解(2)
【10月更文挑战第3天】
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
1月前
|
编译器 C语言
C语言预处理详解
C语言预处理详解
|
1月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
19 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6