C语言预处理命令你了解多少?

 2024-02-21 03:01:54  阅读 0

我们在编写C语言程序时经常使用库函数之前,应该使用#来引入相应的头文件。 这类以#开头的命令称为预处理命令。 但是你对C语言的预处理了解多少呢? 快来跟随斌哥学习C语言的预处理吧!

1.什么是预处理?

预处理指令是以#号开头的代码行。 # 符号必须是该行的第一个字符,不包括任何空白字符。 # 后面是命令关键字,关键字和 # 符号之间允许有任意数量的空白字符。 整行语句构成一条预处理指令,在编译器编译源代码之前对源代码执行某些转换。 以下是一些预处理指令:

c.语言头文件_c语音头文件_c语言头文件的作用

还有以下预处理宏(双下划线)

__LINE__ 表示正在编译的文件的行号__FILE__表示正在编译的文件的名字__DATE__表示编译时刻的日期字符串__TIME__ 表示编译时刻的时间字符串__STDC__ 判断该文件是不是定义成标准 C 程序

2.预处理有什么用?

在集成开发环境中,编译和链接是同时完成的。 事实上,C语言编译器在编译源代码之前还需要进行进一步的处理:预编译。

所以,完整的步骤是:预编译->编译->链接

预编译的主要作用如下:

1.将源文件中以”include”格式包含的文件复制到编译的源文件中。2.用实际值替换用“#define”定义的字符串。3.根据“#if”后面的条件决定需要编译的代码。

预处理是C语言的一个重要功能,由预处理器完成。 编译源文件时,系统会自动调用预处理程序来处理源程序的预处理部分。 处理完成后,会自动进入源程序的编译。

预处理的行为由指令控制。 这些指令是以#字符开头的命令。

# 指令定义了一个宏——用于表示其他内容的命令,通常是某种类型的常量。 预处理器通过存储宏的名称及其定义来响应 # 指令。 当稍后在程序中使用该宏时,预处理器“扩展”该宏,用它定义的值替换该宏。 例如:下面这行命令:

#PI3。

# 指令告诉预处理器打开特定文件并将其内容“包含”为正在编译的文件的一部分。 例如:下面这行命令:

#

指示预处理器打开名为 stdio.h 的文件并将其内容添加到当前程序。

预处理器的输入是C语言程序,其中可能包含指令。 预处理器执行这些指令并在处理过程中删除它们。 预处理器的输出是另一个程序:原始程序的编辑版本,不再包含指令。 预处理器的输出直接提供给编译器,编译器检查程序是否有错误并将其转换为目标代码。

3. 3种预处理详解

1. 宏定义说明

宏定义了代表特定内容的标识符。 预处理过程将源代码中出现的宏标识符替换为定义宏时的值。 宏最常见的用途是定义表示某个值的全局符号。 宏的第二种用途是定义带参数的宏(宏函数)。 这样的宏可以像函数一样被调用,但是它在调用语句处扩展了宏,并用调用时的实参替换了定义中的形式参数。 。

1.1 #说明

1.1.1 #指令用于定义宏。 该指令最简单的形式是:声明一个标识符并给出该标识符所代表的代码(例如像pi这样的数字)。 在下面的源码中,我们可以使用定义的宏来替换要使用的代码。 代码示例:

#define PI 3.141592654

1.1.2 使用宏有两个好处

首先,它易于使用。 如下:

#define PI 3.1415926

PI显然比3更容易写。

其次,定义的宏有意义且可读性强。 例如,在示例1中,您将从文本中知道它表示最大数字,这比简单地使用数字10更具可读性。

第三,易于修改。 如例1,如果程序中使用了几十次,则只需在宏定义中修改一次即可,否则会修改直至崩溃。

2. 条件编译说明

程序员可以通过定义不同的宏来决定编译器处理哪些代码。 条件编译指令确定哪些代码被编译,哪些不被编译。 编译条件可以根据表达式的值或是否定义了特定的宏来确定。

2.1 #if/#endif/#else/#elif指令

#if 指令检测 make-other 关键字后面的常量表达式。 如果表达式为真,则编译下面的代码,直到出现#else、#elif或#endif; 否则不会被编译。

#endif用于终止#if预处理指令。#else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。

代码示例

#define DEBUG       //此时#ifdef DEBUG为真//#define DEBUG 0  //此时为假int main(){   #ifdef DEBUG      printf("Debugging\n");   #else      printf("Not debugging\n");   #endif   printf("Running\n");   return 0;}  

这样我们就可以实现debug功能了。 每次输出调试信息之前,我们只需要#ifdef DEBUG判断一次即可。 如果不再需要,请在文件开头定义#DEBUG 0。

#elif 预处理指令结合了#else 和#if 指令的功能。

3.头文件包含指令

使用头文件的主要目的是使某些定义可用于多个不同的 C 源程序。 因为在需要使用这些定义的C源程序中,只需要添加#语句即可,而不必在这个文件中重复这些定义。 预编译器会将头文件中的所有定义添加到它生成的输出文件中,以供编译器处理。

#预处理指令的作用是扩展指令处包含的文件。 包含可以是多个,这意味着包含的文件还可以包含其他文件。 标准 C 编译器支持至少八层嵌套包含。 预处理过程不会检查文件是否已包含在翻译单元中,并防止多次包含该文件。 上面已经给出了处理方法。

在程序中包含头文件有两种格式:

 #include  #include "my.h"

第一种方法是用尖括号将头文件括起来。 此格式告诉预处理器在编译器附带的头文件或外部库中搜索包含的头文件。 第二种方法是将头文件用双引号引起来。 这种格式告诉预处理器在当前编译的应用程序的源代码文件中搜索包含的头文件,如果没有找到,则搜索编译器附带的头文件。

使用两种不同包含格式的原因是编译器安装在公共子目录中,而编译后的应用程序则安装在它们自己的私有子目录中。 应用程序包含编译器提供的公共头文件和自定义私有头文件。 使用两种不同的包含格式允许编译器在许多头文件中区分一组通用的头文件。

4. 总结

预编译器所做的基本上就是“替换”源程序。 进行此替换后,将生成一个没有宏定义、没有条件编译指令、也没有特殊符号的输出文件。 该文件的含义与未预处理的源文件相同,但内容不同。 接下来,这个输出文件被翻译成机器指令作为编译器的输出。

标签: 指令 编译 定义

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码