【C语言】预处理超级详细解析
admin
2024-03-30 05:45: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

相关内容

热门资讯

刚辞职的韩国国足主教练洪明甫遭... 新华社北京6月29日电 韩国警方29日说,由于刚刚辞职的韩国国家足球队主教练洪明甫遭遇死亡威胁,洪明...
真情陪伴暖桑榆——“欢乐陪伴·... 6月27日,由福州市永泰县委社会工作部、永泰县民政局指导,永泰县慈善总会、永泰县霞拔乡人民政府、永泰...
从硬扛到指尖轻点,听障人士:1... “报警成功了!”近日,在荆州市消防救援中心指挥大厅,一名听障人士低头操作手机,通过荆州消防微信公众号...
德国北部发生枪击事件致5人死亡 据德媒援引德国警方消息报道,德国北部施塔德29日发生枪击事件,致5人死亡,嫌疑人已被抓获。 来源|新...
豆包APP灰测打车出行 6月22日消息,豆包APP在北京、杭州两地灰测一键打车服务,由曹操出行提供打车服务。 (科创板日报)
北京:端午假期重点监测127家... 6月22日消息,端午假期期间(2026年6月19日-21日),北京市重点监测的127家企业实现销售6...
英矽智能:与SK生物制药达成一... 6月22日消息,英矽智能在港交所公告,英矽智能已与SK生物制药公司达成一项研发合作,旨在发掘AI驱动...
劳埃德银行:计划招聘近300名... 6月22日消息,劳埃德银行日前发布声明称,未来几个月,集团将招聘近300名与智能体人工智能相关人才,...
十四届全国人大常委会第二十三次... 6月22日消息,今天全国人大常委会法制工作委员会举行的记者会上介绍,十四届全国人大常委会第六十八次委...
央视揭回收老物件直播骗局 (来源:中国反邪教) 转自:中国反邪教 #200元雇人直播骗了200万元#【#央视揭回收老物件直播骗...