c - const number 的预处理指数
问题描述
我的问题:我想获得一个带有 N_DIGITS 数字的 id,并且我希望 N_DIGITS 在预处理时可以自定义。我的 id 是一个整数,所以我想将 10^N_DIGITS 定义为这个数字的最大值。
换句话说:是否可以使用宏作为指数来预处理数字?
这是我的终极尝试:
#include <stdio.h>
#define N_DIGITS 5
#define MAX_N 10e ## N_DIGITS
int main()
{
printf("%d\n", MAX_N);
return 0;
}
当然,这不起作用,错误是error: exponent has no digits
. 我不明白为什么无法实现该原理,因为编译器知道所有内容,但我可能错了。
无论如何我的语法不正确,我可以在这里得到一些帮助吗?
解决方案
令牌粘贴是在宏扩展之前完成的,所以你会得到10eN_DIGITS
不是有效的令牌。
您可以做的是有两层类似函数的宏 - 一层用于宏扩展,另一层用于粘贴:
#define N_DIGITS 5
#define MAKE_EXPONENT2(exp) 10e ## exp
#define MAKE_EXPONENT(exp) MAKE_EXPONENT2(exp)
#define MAX_N MAKE_EXPONENT(N_DIGITS)
这使得MAX_N
展开到10e5
.
其他问题:
- 10e5 是一个
double
常数,所以需要用 打印%f
,而不是%d
。 - 如果你想要 10 的 5 次方,那么你需要 1e5 而不是 10e5。
- 使用浮点常量处理整数数据可能会导致精度损失。
推荐阅读
- php - 关于mysql的问题
- git - 将删除文件添加回 git 中具有相同名称的分支
- angular - 隐藏 Angular 8 中的导航栏(auth-guard 路由未记录在 routes.event 中)
- java - 在凌空请求中传递会话 ID 的简单方法
- python - RandomForest 和 XGB 为什么/如何?对此有什么可以做的吗?
- azure-cosmosdb - Azure Cosmos 是否有用于可视化和编辑的良好 GUI?
- assembly - AVR 组件 - 比较后寄存器的旋转问题
- swift - 通过 Selector 向其他班级发送消息
- sql - PL/SQL Oracle 按特定日期范围选择数据库中的表
- scala - 有没有办法将带括号的 0-arity 方法迁移到不带括号的方法?