【C语言】预处理超级详细解析
创始人
2024-01-13 02:52:32
0

前言:

作者简介:爱吃大白菜1132

人生格言:纸上得来终觉浅,绝知此事要躬行

 

如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!

 

如果觉得博主文章还不错的话,希望三连支持!

目录

 

1.预处理符号

2.#define

#define 定义标识符 

#define 定义宏

#define 替换规则 

3.宏定义中的#和##号的区别 

#的作用

##的作用

4.条件编译


1.预处理符号

__FILE__      //进行编译的源文件
__LINE__      //文件当前的行号
__DATE__      //文件被编译的日期
__TIME__      //文件被编译的时间
__STDC__      //如果编译器遵循ANSI C,其值为1,否则未定义

以上预定义符号都是C语言内置的。

2.#define

#define 定义标识符 

语法:#define name stuff

例如:

#include 
#define MAX 10int main()
{printf("%d\n", MAX);//打印10return 0;
}

#define 定义宏

语法:#define name( parament-list ) stuff

注:

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

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

#include 
#define SUM(a,b) (a)+(b)int main()
{printf("%d\n", SUM(2, 3));return 0;
}

 注:

        由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应该尽量使用括号明确优先级。

#define 替换规则 

在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

        1. 在调用宏时,首先对宏中参数进行检查,检查是否包含任何由#define定义的符号。如果有,它们首先被替换。

        2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。

        3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果有,就重复上述处理过程。

3.宏定义中的#和##号的区别 

#的作用

        加上#后进入宏定义,在预处理时,不会将其改变成参数,而是保留参数所对应的字符串。

#include #define PRINT( VALUE,FORMAT) printf("the value of  "#VALUE" is " FORMAT "\n", VALUE);
int main()
{int a = 3;PRINT(a,"%d");//预处理会替换为://printf("the value of  a is %d\n", a);
}

##的作用

##可以把位于它两边的符号合成一个符号。

它允许宏定义从分离的文本片段创建标识符。

//FUC将c和h粘合到一起,相当于字符名ch
#include #define FUC(A,B) A##Bint main()
{char ch[] = "hello world";printf("%s\n", FUC(c,h) );
}

4.条件编译

常见的条件编译指令:

1.#if 常量表达式//...#endif//常量表达式由预处理器求值。如:#define __DEBUG__ 1#if __DEBUG__//..#endif
2.多个分支的条件编译#if 常量表达式//...#elif 常量表达式//...#else//...#endif
3.判断是否被定义#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol
4.嵌套指令#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif#endif

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...