C语言 #define 用法

一.define 简介

C 语言中,除了可以用 #define 定义一个标识符来表示一个常量,还可以用 #define 定义函数,例如:

//定义常量
#define A 100                   //定义整型变量A值为100
#define B "Hello"              //定义字符串变量B值为"Hello"(定义字符串需要加双引号)
#define C 3.1415926        //定义浮点数变量C值为3.1415926

//定义函数
#define MAX(a,b) (a>b)?a:b  //取两个数最大值
#define MIN(a,b) (a<b)?a:b  //取两个数最小值


       凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

二.define 定义函数

1.define 定义不带参数的函数

#include <stdio.h>

#define A (x*2+5)

int main(void)
{
    int x = 2;

    printf("A是:%d\n",A);

    return 0;
}

/*
A是:9
*/

2.define 定义带参数的函数

#include <stdio.h>
 
#define A(x) (x*2+5)
 
int main(void)
{

    printf("A是:%d\n",A(2));
 
    return 0;
}
 
/*
A是:9
*/
#include <stdio.h>

#define MAX(a,b) (a>b)?a:b  //取两个数最大值
#define MIN(a,b) (a<b)?a:b  //取两个数最小值

int main(void)
{
    printf("最大值是:%d\n",MAX(5,100));
    printf("最小值是:%d\n",MIN(5,100));
    return 0;
}

/*
最大值是:100
最小值是:5
*/


三.define 定义函数陷阱

1.define 函数陷阱一

#include <stdio.h>

#define A(x) x*x

int main(void)
{
    printf("A是:%d\n",A(2));    //2*2=4
    printf("A是:%d\n",A(2+1)); //2+1*2+1=5
    return 0;
}

/*
A是:4
A是:5
*/
#include <stdio.h>

#define A(x) (x)*(x)

int main(void)
{
    printf("A是:%d\n",A(2));    //(2)*(2)=4
    printf("A是:%d\n",A(2+1)); //(2+1)*(2+1)=9
    return 0;
}

/*
A是:4
A是:9
*/

2.define 函数陷阱二

#include <stdio.h>

#define A(x) (x)*(x)
int main(void)
{
    printf("A是:%d\n",A(2));      //(2)*(2)=4
    printf("A是:%d\n",9/A(2+1)); //9/(2+1)*(2+1)=9
    return 0;
}

/*
A是:4
A是:9
*/
#include <stdio.h>

#define A(x) ((x)*(x))
int main(void)
{
    printf("A是:%d\n",A(2));      //((2)*(2))=4
    printf("A是:%d\n",9/A(2+1)); //9/((2+1)*(2+1))=1
    return 0;
}

/*
A是:4
A是:1
*/

总结:

#define  A(x)  x*x
A(2) 等价 2*2 = 4
9/A(2+1) 等价 9/2+1*2+1 = 7

#define  A(x)  (x)*(x)
A(2) 等价 (2)*(2) = 4
9/A(2+1) 等价 9/(2+1)*(2+1) = 9

#define  A(x)  ((x)*(x))
A(2) 等价 ((2)*(2)) = 4
9/A(2+1) 等价 9/((2+1)*(2+1)) = 1

参考原文:

https://blog.youkuaiyun.com/ZhaDeNianQu/article/details/120095018

### C语言 `define` 宏定义使用方法 在C语言中,宏定义通过预处理器指令 `#define` 实现。当编译器遇到此指令时,在实际编译之前会执行相应的替换操作。 #### 基本形式 最简单的宏定义用于常量替代: ```c #define PI 3.1415926 ``` 这条语句表示在整个源文件范围内任何地方出现的标识符PI都将被数值3.1415926所代替[^2]。 #### 参数化宏 带有参数的宏可以像函数一样调用,但它们不是真正的函数而是文本替换: ```c #define SQUARE(x) ((x)*(x)) ``` 这里定义了一个名为SQUARE的一元运算符风格的宏,它接受一个输入并返回该数与其自身的乘积。注意双括号是为了防止某些情况下优先级错误引发的问题[^3]。 #### 条件判断宏 还可以创建更复杂的表达式作为宏体: ```c #define MAX(a, b) (((a) > (b)) ? (a) : (b)) ``` 这段代码实现了两个值之间的最大值比较逻辑。同样地,额外的小括号有助于确保正确的求值顺序。 #### 输出信息宏 对于调试目的来说,经常需要用到打印功能来显示变量的状态或其他运行期数据: ```c #define PRINT_COUNT(x) printf("the count is %d\n", x) ``` 上述例子展示了如何构建一个方便使用的计数输出接口,其中包含了固定的前缀文字以及待传入的具体数值部分。 #### 取消宏定义 如果希望在一个特定的作用域之后不再应用某个宏,则可以通过 `#undef` 指令取消其有效性: ```c #undef PI ``` 这样做的好处是可以避免不同模块间可能存在的命名冲突问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值