我在头文件中定义了一个名为 A 的常量;它始终是偶数。
我想在同一个头文件中声明一个数组B,其长度取决于A的值。
例如;
如果 A 是 32,我希望数组大小为 4,(2,4,8,16 是元素。2 的所有幂,直到 A/2)。
如果 A 是 48,我希望数组大小为 5,(2,4,8,16,24 是元素。2 的所有幂直到 A/2,最后一个元素是 A/2)。
使用上述逻辑计算给定 A 值的 B 数组大小的优雅方法是什么?
最佳答案
您需要对 A
使用 #define
,但既然您这样做了,您就可以使用如下方案进行管理:
#define A 384
#define B_SIZE (A <= 16 ? 3 : A <= 32 ? 4 : A <= 64 ? 5 : A <= 128 ? 6 : \
A <= 256 ? 7 : A <= 512 ? 8 : A <= 1024 ? 9 : -1)
extern int B[B_SIZE];
使用-1
作为尾部值并非偶然;它确保了编译错误,因为数组的大小不能为负,因此如果 A
太大,代码将无法编译。您也可以使用相同的技巧来排除太小的尺寸。
在定义和初始化数组的代码中,您使用:
int B[B_SIZE] =
{
2, 4,
#if A > 16
8,
#endif
#if A > 32
16,
#endif
#if A > 64
32,
#endif
#if A > 128
64,
#endif
#if A > 256
128,
#endif
#if A > 512
256,
#endif
A/2
};
这并不优雅,但我不确定是否有更简洁的方法。如果 A
的值超出范围,这会再次显式使用 B_SIZE
以确保再次出现编译错误。否则,您可以将 B_SIZE
排除在数组规范之外。
您可以轻松编写 shell(Awk、Perl、Python...)脚本来生成给定大小的代码。
关于c - 如何在C头文件中分配特定的数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825393/