如何在C头文件中指定特定的数组大小
我在头文件中定义了一个名为a的常量;它总是一个偶数 我想在同一头文件中声明一个数组B,其长度取决于A的值 比如, 如果A是32,我希望数组大小是4,(2,4,8,16是元素,直到A/2的所有幂都是2) 如果A是48,我希望数组大小是5,(2,4,8,16,24是元素,所有2的幂直到A/2,最后一个元素是A/2)如何在C头文件中指定特定的数组大小,c,arrays,header-files,C,Arrays,Header Files,我在头文件中定义了一个名为a的常量;它总是一个偶数 我想在同一头文件中声明一个数组B,其长度取决于A的值 比如, 如果A是32,我希望数组大小是4,(2,4,8,16是元素,直到A/2的所有幂都是2) 如果A是48,我希望数组大小是5,(2,4,8,16,24是元素,所有2的幂直到A/2,最后一个元素是A/2) 使用上述逻辑计算给定a值的B数组大小的优雅方法是什么?也许我遗漏了什么。为什么不简单地将数组定义为: int array[] = { 2,4,8,16 #if A == 48
使用上述逻辑计算给定a值的B数组大小的优雅方法是什么?也许我遗漏了什么。为什么不简单地将数组定义为:
int array[] = {
2,4,8,16
#if A == 48
,24
#endif
};
#define DIM_OF_ARRAY (sizeof(array)/sizeof(array[0]))
对于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];
这不优雅,但我不确定有没有更整洁的方法来做。这将再次显式使用B_SIZE
,以确保在a
的值超出范围时再次出现编译错误。否则,您可以将B_大小
保留在数组规范之外
您可以很容易地编写一个shell(Awk、Perl、Python等)脚本来生成给定大小的代码。如果我们可以将
a
限制为2的幂,那么这与另一个问题有关:“如何在编译时计算整数类型中的值位数?”十多年前,Hallvard B Furuseth完美地解决了这个问题。见:
使用Hallvard的解决方案,我们可以计算数组大小,如下所示:
#include <stdio.h>
/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))
#define A 1073741824
int B[IMAX_BITS(A/2-1)];
int main (void)
{
printf ("%d\n", (int)(sizeof B / sizeof B[0]));
return 0;
}
#包括
/*inttype_MAX或任何(1)为什么必须静态声明数组。这听起来像是需要计算和动态分配的事情。我希望在头中声明数组,因为我将在多个c文件中使用它。您可以在一个模块中定义它,并使用“extern”@OmerEldan导出它。您能举个例子并将其作为答案发布吗我认为数组需要是floor(log2(A-1))。将其表示为编译时可计算的常量值并不容易。但请注意,这应该在C源文件中以这种方式定义。头文件应该只包含int-array[]
。很有趣,但不是那么相关,因为问题明确提到,A
可以有值48,这不是2的幂。@JonathanLeffler:Dang,我错过了那部分。实际上我读了,但忘了它。在回答中重新表述了假设。
#include <stdio.h>
/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))
#define A 1073741824
int B[IMAX_BITS(A/2-1)];
int main (void)
{
printf ("%d\n", (int)(sizeof B / sizeof B[0]));
return 0;
}