C-Preprocessor:计算结构数组中的元素数

时间:2016-08-29 12:50:44

标签: c c-preprocessor

让我们说,我在C应用程序中有一个结构:

typedef struct {
    int aParameter;
    int anotherParameter;
} Structure_t;

和一组Structure_t元素:

const Structure_t arrayOfStructres[] = {
    {
        .aParameter = 1,
        .anotherParameter = 2
    },
    {
        .aParameter = 3,
        .anotherParameter = 4
    },
};

arrayOfStructures是常量,因此在运行时没有变化。这意味着,理论上,在编译期间,数组中元素的数量是已知的。我知道我可以用

来计算元素的数量
sizeof(arrayOfStructures) / sizeof(arrayOfStructes[0]);

在运行时,但如何在编译时使用预处理器获取元素数量?由于元素的数量可能远远超过示例中的两个元素,因此在添加或删除某些元素时计算每个元素的速度不是很快且也容易出错。

3 个答案:

答案 0 :(得分:2)

const限定符与给定数组中的元素数无关。 C中的数组具有固定的大小(好的,除了灵活的数组成员,但它是不同的东西),不可能在运行时扩展它们的元素。

sizeof运算符将(间接)在编译时为您提供元素数。唯一的例外是VLA(可变长度)数组,其sizeof计算为运行时,但即使使用它们,也无法在声明后添加更多元素(因为"变量长度"有点不幸的名称)

答案 1 :(得分:2)

  

我知道我可以在运行时使用sizeof(arrayOfStructures)/sizeof(arrayOfStructes[0]);来计算元素的数量

不,这个计算是在编译时完成的,所以这就是你需要的。

在运行时完成sizeof的唯一计算是VLA的特殊情况,这里不适用。

答案 2 :(得分:0)

我认为您可以使用在编译时运行的_countof宏,有关详细信息,请查看here