C语言——宏定义问题

1. 问题:最近遇到一个问题,关于“单精度操作数隐式转换为双精度”与宏定义有关

#define temp 45.5
float a =0;
a=temp;

大致是这样,原来的式子是a=temp的相关运算,式子中的运算都转成float类型了,但报警告:单精度操作数隐式转换为双精度,…\HARDWARE\xxxx.c(147): warning: #1035-D: single-precision operand implicitly converted to double-precision
原因:
#define temp 45.5 使用宏定义,默认为double类型
本身宏定义不会指定类型,只会文本替换,将45.5替换到文本中,默认就是double类型
解决办法:

#define temp 45.5f

double a=0;
a =temp;

另外有关这个警告的其他问题和解决办法还有:

float a =0.1;

将其修改为

float a=0.1f;

即可解决。
原因:
float代表浮点型数据类型,浮点型数据又分为单精度和双精度两种,1.0小写f或者大写F代表他是单精度的,如果1.0后面跟的是小写d后者大写D代表他是双精度的

有关宏定义的其他注意事项

1. 宏延续运算符\

当一个宏很长要换行的时候可以用例如

#define PRINT printf(hello \ 
			word!)

2. 字符串常量化运算符#

#include <stdio.h>

#define STRINGIFY(x)  #x  // 使用#运算符将参数转为字符串

int main() {
    int num = 10;
    const char* str = STRINGIFY(num);  // 将num转为字符串

    printf("The stringified value is: %s\n", str);  // 输出:The stringified value is: num
    return 0;
}

#x:STRINGIFY 宏中的 #x 会把 x 转换成字符串 “x”,即使 x 是一个变量。
在 main 函数中,调用 STRINGIFY(num) 会将 num 转换为 “num”(即字符串形式)。

3. 要合并2个参数时,要标记粘贴运算符##

#include <stdio.h>

#define CONCAT(a, b)  a##b  // 使用##将两个参数连接成一个新的标识符

int main() {
    int xy = 100;  // 定义一个变量 xy

    // 使用宏将两个参数连接成变量名
    printf("The value of xy is: %d\n", CONCAT(x, y));  // CONCAT(x, y) 会变成 xy

    return 0;
}

a##b:CONCAT(x, y) 宏将 x 和 y 连接在一起,形成 xy,这是一个合法的标识符。
在 main 函数中,CONCAT(x, y) 会被预处理器替换成 xy,这相当于直接访问变量 xy,它的值是 100。
输出结果就是The value of xy is: 100

4. 使用小括号更加清晰

在宏定义中将需要转换替代的部分使用小括号表达更加清晰

5. 推荐文章和另外的注意事项

以下资料来源:https://blog.csdn.net/2301_79558858/article/details/135647838
参考文章,侵权联系删除
在这里插入图片描述

1. 带有副作用的宏参数​
当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。
2. 宏与函数的对比​

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值