Глобальные массивы постоянного размера в C - PullRequest
4 голосов
/ 05 декабря 2011

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

// 1:
#define ASIZE 10
int array[ASIZE];

// 2:
enum {ASIZE = 10};
int array[ASIZE];

// 3:
#define ASIZE_DEF 10
static const int ASIZE = ASIZE_DEF;
int array[ASIZE_DEF];

Проблема сПервые два: я не могу получить значение ASIZE из GDB.Я думаю, что третий вариант лучше, потому что я все еще могу сбросить значение const, но он также просачивается в другой макрос.Я могу undef макрос после определения массива и const, но если #define и const находятся в отдельном файле от объявления массива, то он становится немного волосатым.

есть лучший способ?

Ответы [ 4 ]

8 голосов
/ 05 декабря 2011

Делать что-то ради отладчика неправильно.Кстати, gdb знает об этом , если вы правильно скомпилируете свой код .

Некоторые языки, такие как C и C ++, предоставляют способ определения и вызова«Макросы препроцессора», которые расширяются в цепочки токенов.GDB может оценивать выражения, содержащие вызовы макросов, показывать результат раскрытия макроса и показывать определение макроса, включая место его определения.

Версия 3.1 и более поздних версий gcc, компилятора gnu C, предоставляет информацию о макросах, если выукажите опции -gdwarf-2 и -g3;первая опция запрашивает отладочную информацию в формате Dwarf 2, а вторая запрашивает «дополнительную информацию».

5 голосов
/ 06 декабря 2011

Насколько я понимаю, вы определяете константу, позже используете ее для определения размера одного или нескольких массивов, а также хотите, чтобы эта константа была символом, предпочтительно без запутанного пространства имен. (Если бы речь шла об экспорте размера одного массива, я бы вместо этого предложил sizeof(array) / sizeof(*array), как отсутствовал.)

static const int ASIZE = 10;
#define ASIZE            10
int array[ASIZE];

Здесь есть переменная с желаемым значением, которая будет в объектном файле, но макрос препроцессора затеняет его самим значением, поэтому определение массива также успешно выполняется.

Однако может возникнуть необходимость дублировать выражение значения безобразно. Разве не было бы хорошо, если бы мы могли определить переменную в терминах макроса?

static const int ASIZE =
#define ASIZE 10
                         ASIZE;
int array[ASIZE];

Я не уверен, что это на самом деле лучшая идея с точки зрения обслуживания, чем описанная выше, но это работает (и я не мог заставить gcc обидеться), и оно не содержит дублирования, кроме идентификатора. И это забавно.

5 голосов
/ 05 декабря 2011

Вы имеете дело с проблемой GDB, а не проблемой C.Вы также можете сделать # 4, что, вероятно, лучше, чем # 3.

enum {ASIZE = 10};
static const int ASIZE_FOR_GDB = ASIZE;
int array[ASIZE];
2 голосов
/ 05 декабря 2011

Поскольку вы знаете, array - это глобальный массив (а не только указатель), вы можете найти его длину, используя

sizeof(array) / sizeof(*array)

без необходимости устанавливать дополнительную переменную для этого.

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