C语言define关键字与条件编译深度解析

创始人
2024-12-21 16:26:57
0 次浏览
0 评论

C语言#define关键字,条件编译及预定义符号知识详解

C标准规定我们在文件输入输出、输出日志等情况下会使用这五个预处理符号。
否则返回字母以外的字符错误2#define关键字#define有两个功能;一是设置标识符,二是设置宏1。
当指定标识符时;请勿在定义2定义的标识符中包含分号。
定义宏#define机制包含一个允许用文本替换参数的子句。
这种实现通常称为宏或定义宏。
宏不应包含在括号中,以防止由于优先级问题而产生令人难以置信的后果。
字符串中的内容不会发生宏替换。
3、#和##编译器会自动将两个相邻的字符串连接成#一:在字符串中添加参数#a->"a"##可以添加符号。
作为两边的符号4.宏和函数的比较①宏没有类型检查是宏的一个关键特性(但这也是一个隐私风险)。
用多个函数无法实现的动作②宏没有函数调用、返回等额外开销,逻辑复杂,代码量大。
呼叫和回电的覆盖范围很小。
③宏只是替换文本,无法调试;4.宏可以增加代码长度。
将如果计算表达式的结果并且传递给参数宏的参数是表达式,仅替换文本,不执行任何计算摘要:每个宏都使用少量代码。
函数用于大量代码基于C++中宏概念的优缺点使用内联;最好不要使用宏5。
有副作用的宏参数不要将有副作用的参数传递给宏。
参数6.命名约定定义的宏:全部大写功能:不全部大写例外#undefname//撤销宏标识符名称的定义3.条件编译1.如果设置了DEBUG;声明将被执行;如果不,不会这么做2.条件编译3.断面条件编译3.判断是否设置4.嵌套指令预处理指令可以嵌套4.其他1.包含头文件2.#error"..."会遇到#error时产生编译错误Canfittargetspace4.assert(条件语句)是断言的目标字符串的头文件5.可能发生连锁反应。
连锁反应printf("%d",strlen(strcpy(p,helloworld!"))))6、常见错误:编译错误直接指编译器错误信息,即链接器错误函数名、变量名错误、库文件使用错误(第三方库)。

C语言,#define语句的用法。

​1.简单宏定义

格式:#define标识符替换列表

描述:替换列表包含数字、文字、标点符号、运算符、标签、关键字、字符常量。

注意:替换列表可以为空

常见错误:

#defineN=100inta[N];/*这将是inta[=100],它就像一个ID符号*/#defineN100。
;inta[N];/*带分号的解释会是int[100;]这是一个很常见的错误*/*第一个想法是a和b都是int类型的指针,但实际上它们是int*a,b;a是int类型的指针,b是int类型的变量。
这就是为什么应该使用typedef而不是声明,以便a和b都是int指针。
*/

<

<

常见用法:

您可以使用宏定义根据自己的需要来定义或修改C语言。
语法例程,例如:

#defineBEGIN{#defineEND}intmain()BEGINprintf("DEFINE----\n");END

定义循环

#为(;;)定义LOOP

重新定义数据类型

#defineITint

2.带参数的宏

#define标识符(x1,x2,x3...xn)替换清单(注:x1,x2,x3..是宏的参数,标签和左括号之间不能有空格)

用法:

#定义max(x,y)((x)>(y)?(x):(y))i=MAX(j+k,m-n);

by

i=MAX((j+k).>>(m-n)?(j+k):(m-n));#声明SI_EX(n)((n)%2==0)if(SI_EX(i))i++;

替换为

IF(SI_EX((i)%2==0))

从上面的例子可以理解,标签被替换为参数列表(X1,X2,X3....)。
(Y1,Y2,Y3....)对应替换,但顺序无关。

B(x)#@x​#defineC(x)#x​x=1

​替换为:

T_1(T_##x,##符号是将前后字符连接在一起的粘性符号。
)

'1'(#@x,#@符号将宏参数视为字符串文字和``添加符号)

1"(#x),#符号将宏的参数转换为字符串字面大小的字符,并添加""符号)

4.多行定义

定义可以在每个新行上替换多行代码“\”

#defineMAX(X,Y)do{\语句1;\语句2;如何编写注释*/\}whilep>5.在广泛的开发过程中,尤其是跨平台和系统软件中,最重要的任务是条件编译。
编译就可以了。
编译时带有#define的环境

6.删除宏

#unknowntag

7.条件组合

#ifdefXXX…(#else)…#endif

8.预定义宏

C语言中包含一些有用的宏。

__LINE__编译文件的行数

(整数类型)

__FILE__编译文件的名称(字符类型)

__DATE__编译日期(字符类型)

__TIME__编译时间(字符类型)

__STDC__如果编译器接受标准C,则值为1。
(整数类型)

通常这些预定义的宏可以用于编译过程中的调试:例如:

当被零除正常发生时,编译器不存在。

#defineCHECKZERO(divisor)\if(divisor==0)\printf("***尝试在lINE%d文件%s中除以零***\n",__LINE__,__FILE__);\

参考方法

CHECKZERO(j);k=i/j;
热门文章
1
C语言字符串常量解析:区别、用途及存储方... 什么是字符串常量字符串常量是C语言中的一种数据类型,它是由一对双引号括起来的字符...

2
C语言printf函数:格式字符串与输出... printf函数中的格式与输出项有什么关系?在C语言中,printf函数中的格式...

3
Excel技巧:计算字符串起始位置与合并... 如何计算字符串在特定文本中的起始位置,怎么计算字符串在特定文本中的起始位置您可以...

4
Python发音全解:掌握正确的发音方法... python怎么读我的很多学习编程的朋友可能都知道Python这个词,但是他们中...

5
字符与字符串:编程中的基础文本类型解析 字符串什么意思字符串是由数字、字母和下划线组成的字符串,表示为s=“a1a2…a...

6
Python编程语言:多领域应用与开发优... Python的作用是什么?Python是一种跨平台计算机编程语言,是ABC语言的...

7
深度解析:C语言编程特点与应用领域 什么叫c语言C语言是一种编程语言。C编程语言应用广泛,具有以下特点和特点:1.语...

8
Java全解析:跨平台编程语言的魅力与多... java是什么Java是一种功能强大的编程语言,被称为“一次编写,随处运行”模型...

9
C语言赋值与相等运算符的区别解析 c语言中=和==有什么区别?1.各种含义:“=”表示赋值。它的功能是将表达式的值...

10
C语言实现字符串next数组:原理与实例... 如何用C语言编写一个字符串的next数组?对于字符串“abcdeabc”,可以通...