Как определить длину массива во время компиляции?

Существуют ли макросы или встроенные функции, которые могут возвращать длину массивов во время компиляции в GCC?

Например:

int array[10];

Для которого:

sizeof(array) == 40
???(array) == 10

Обновление0

Я мог бы просто указать, что сделать это на C++ тривиально. Можно создать шаблон, который возвращает число внутри []. Я был уверен, что когда-то нашел макрос/встроенную функцию lengthof и dimof в компиляторе Visual C++, но больше не могу найти.


person Matt Joiner    schedule 02.08.2010    source источник
comment
См. также вопрос SO: array">Есть ли в C стандартная функция, возвращающая длину массива?   -  person Craig McQueen    schedule 21.03.2011


Ответы (3)


(sizeof(array)/sizeof(array[0]))

Или как макрос

#define ARRAY_SIZE(foo) (sizeof(foo)/sizeof(foo[0]))

    int array[10];
    printf("%d %d\n", sizeof(array), ARRAY_SIZE(array));

40 10

Внимание: вы можете применить этот макрос ARRAY_SIZE() к указателю на массив и получить значение мусора без каких-либо предупреждений или ошибок компилятора.

person ndim    schedule 02.08.2010
comment
Ну, похоже, здесь не так уж много конкурентов! - person Matt Joiner; 02.08.2010

Я бы не стал полагаться на sizeof, так как выравнивание может все испортить.

#define COUNT 10
int array[COUNT];

И тогда вы можете использовать COUNT, как хотите.

person tibur    schedule 02.08.2010
comment
Разве выравнивание не важно только для размещения самого массива? Внутри c-массива должно работать sizeof-division. - person nob; 02.08.2010
comment
Я думаю, вы правы: оба sizeof будут учитывать выравнивание. Таким образом, sizeof(blah)/sizeof(type) должен быть безопасным. - person tibur; 02.08.2010

я не знаю о встроенной функции, которая делает это, но я недавно использовал:

размер(массив)/размер(массив[0])

сделать именно это

person trh178    schedule 02.08.2010