1)#define name stuff #define 宏名 宏值 2)#define 宏名(参数列表) 表达式 #define name( parament-list ) stuff 二、什么是宏 计算机科学里的宏是一种抽象的,根据一系列预定义的规则进行文本替换。 宏是一种将一系列命令组织在一起,作为一个单独命令来完成特定任务的方式。在编译语言中,宏展开是在编译...
在这个示例中,我们定义了一个名为MAX的宏,它接受两个参数a和b。宏的定义使用了条件运算符(?:)来比较a和b的值,并返回较大的那个值。在main函数中,我们使用MAX宏来比较num1和num2的值,并将结果存储在max_num变量中。类似地,你可以定义其他宏来简化其他比较操作,例如MIN(找到两个数中较小的一个)、ABS(计算...
如果函功能比较简单,有时候就会出现函数调用的开销比执行函数功能所消耗的时间还长。为了优化程序的性能,使用宏函数就是一个非常好的选择,省去了函数调用时的各种开销,又能像函数一样通过使用宏名和参数来简化复杂表达式。内联函数 通过之前的几个例子,我们会发现宏函数最大的问题就是只能“简单粗暴的文本替换”...
假设应用版本是12.2.0。理想状态是: #defineMY_VERSION 12.2.0#if(MY_VERSION >= 12.2.0)...#elif(MY_VERSION >= 12.1.0)...#else...#endif 可现实情况是#define MY_VERSION 12.2.0这种语法并不支持,12.2.0不是一个有效宏值,不能包含点号;所以这种办法是把点号直接去掉,变成一个大数字。 #include<...
利用宏的执行速度短,那是不是以后就只用宏了呢?这明显是不明智的,函数也有着宏所没有的优点: 3. 每次使用宏的时候,⼀份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序的长度。 4. 宏是没法调试的。 5. 宏由于类型无关,也就不够严谨。(双刃剑) 6. 宏可能会带来运算符优先级的问题...
因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0)和({})。下文将一一对三种方式进行分析,比较各自的优劣点。 1.{} 方式 INT_SWAP 宏使用 {} 封装后形态如下: #define INT_SWAP(a,b)\ { \ int tmp = a; \ ...
格式:#define <宏名/标识符> <字符串> eg:#define PI 3.1415926 说明: ①宏名一般用大写 ②宏定义末尾不加分好; ③可以用#undef命令终止宏定义的作用域 ④宏定义可以嵌套 ⑤字符串“”中永远不包含宏 ⑥宏替换在编译前进行,不分配内存,变量定义分配内存,函数调用在编译后程序运行时进行,并且分配内存 ...
宏的中级应用 do-while(0)的妙用 do-while(0)一般用在宏中有多条命令的时候避免意外条件错误,下面是一个例子,条件为真的时候,执行我们定义的一个宏。 1:if( condition ) 2:DO_SOMETHING_HERE(x); 3:else 4:... 下面是DO_SOMETHING_HERE宏以及宏展开的样子: ...
C 语言比较两个宏是否等价 FANG 13711021 发布于 2019-02-22 我想判断如果一个宏定义为 X 时做操作 A,定义为 Y 时做操作 B。这样写是可以的 #define X 0 #define M X #if M==X #error("Equal!"); #else #error("Not equal"); #endif 我知道这里有一个陷阱。这里的 M 和X 中,任意一个没...
4)替换文中支持可变的参数数量的可变参宏 5)#和##运算法的用法等。define 标识符 当用define只定义标识符时,主要用途是结合条件编译指令使用。比如判断某个标识符是否被定义,然后执行不同的操作。这个用法比较简单,不展开讲述,举例如下://(1)结合ifndef使用 #define FLAG #ifndef FLAG //some codes here...