文章目录
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. 宏与函数的对比