首页 > 解决方案 > 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. 我不明白为什么无法实现该原理,因为编译器知道所有内容,但我可能错了。

无论如何我的语法不正确,我可以在这里得到一些帮助吗?

标签: cpreprocessor

解决方案


令牌粘贴是在宏扩展之前完成的,所以你会得到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。
  • 使用浮点常量处理整数数据可能会导致精度损失。

推荐阅读