const 数的预处理指数
Preprocessing exponent of 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。
- 使用浮点常量处理整数数据可能会导致精度损失。
你可以这样做:
#define N_DIGITS 4
#if N_DIGITS == 1
#define MAX_N 1
#elif N_DIGITS == 2
#define MAX_N 10
#elif N_DIGITS == 3
#define MAX_N 100
#elif N_DIGITS == 4
#define MAX_N 1000
#elif N_DIGITS == 5
#define MAX_N 10000
#else
#error N_DIGITS not in [1..5]
#endif
它不是很优雅,但至少你得到了整数常量而不是浮点常量。
我的问题:我想获得一个 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。
- 使用浮点常量处理整数数据可能会导致精度损失。
你可以这样做:
#define N_DIGITS 4
#if N_DIGITS == 1
#define MAX_N 1
#elif N_DIGITS == 2
#define MAX_N 10
#elif N_DIGITS == 3
#define MAX_N 100
#elif N_DIGITS == 4
#define MAX_N 1000
#elif N_DIGITS == 5
#define MAX_N 10000
#else
#error N_DIGITS not in [1..5]
#endif
它不是很优雅,但至少你得到了整数常量而不是浮点常量。