Как объявить глобальный массив размера, определенного в другом файле в C99? - PullRequest
5 голосов
/ 07 декабря 2010

Принимая во внимание VLA (массив переменной длины), я хотел бы спросить ваше мнение по следующей проблеме: Если массив определен в глобальном масштабе в одном файле:

int arr[] = {1, 2, 3};

// in the same file it is no problem to obtain the number of elements in arr by
#define arr_num sizeof(arr)/sizeof(arr[0])
// or
enum {arr_num = sizeof(arr)/sizeof(arr[0])};

Проблема заключается вв других файлах того же проекта я хотел бы снова создать другие массивы в глобальном масштабе с тем же количеством элементов, что и в arr.Но как можно достичь этого в C99, если нет никакого способа «выйти» из enum или #define.Конечно, можно # определить количество элементов arr вручную в заголовочном файле, а затем использовать его в других файлах, но это очень неудобно, так как при изменении количества элементов в массиве arr также необходимо вручную изменитьзначение этого #define (это еще более неудобно, когда arr является массивом структур).

Большое спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

VLA не помогают с этим: они должны быть автоматическими переменными, и, следовательно, вы не можете сделать глобальную переменную VLA. Я согласен с Вальдо, что наличие глобальной переменной, содержащей размер массива (или, альтернативно, функции, возвращающей его), является правильным подходом.

0 голосов
/ 07 декабря 2010

AFAIK, вы не можете сделать это в соответствии с C99. Поскольку все модули перевода компилируются независимо, тогда как sizeof должно быть известно во время компиляции.

Вы можете сделать что-то вроде этого:

int arr[] = {1, 2, 3};
const int g_arrCount = sizeof(arr)/sizeof(arr[0]);

// other translation unit
extern const int g_arrCount;

Если вы используете опцию оптимизации всей программы - скорее всего, переменная g_arrCount будет полностью опущена, и вместо нее будет использовано ее прямое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...