Разрешено ли использовать #define для определения размера статического массива?

У меня есть много классов в системе, которую я сейчас разрабатываю, и в этих классах у меня есть массив с "именем" чего-то. Имя должно содержать не более 30 символов.

Изначально я использовал всего 10 символов, но теперь мне нужно увеличить лимит. Увеличение лимита занимает время, потому что я использую этот вид массива во многих местах. Было бы проще, если бы я использовал #define NAME_SIZE 30 или что-то в этом роде, и тогда все, что мне нужно сделать, это изменить одно число вместо двадцати.

Однако я не уверен, что это "законно" в C++.

Это сэкономит мне кучу времени в будущем, поэтому я и спрашиваю.

4 ответа

Решение

Да, в этом нет ничего технически неправильного, кроме того, что #define обычно уступает const std::size_t MAX_NAME_SIZE = 30; Еще лучше было бы иметь динамический размер, например, используя std::string,

У Скотта Мейерса есть интересная колонка о системах, использующих безвозмездные фиксированные размеры, которая называется "Проблема замочной скважины".

Проблема замочной скважины возникает каждый раз, когда программное обеспечение искусственно ограничивает то, что вы хотите увидеть, или то, что вы хотите выразить. Если вы хотите увидеть изображение, но ваше программное обеспечение для просмотра изображений искусственно ограничивает объем изображения, которое вы можете видеть за раз, это проблема замочной скважины. Если вы хотите указать пароль определенной длины, но ваше программное обеспечение говорит, что он слишком длинный, это проблема замочной скважины. Если вы хотите ввести свой номер телефона в США, но ваше программное обеспечение не позволяет вам перемежать его обычным способом с чертой между трехзначным префиксом и четырехзначным обменом, это проблема замочной скважины.

Помимо раздражения пользователей, вы также открываете свои системы для всех видов проблем безопасности (например, эксплойты переполнения буфера).

Да, это законно. Но обычно предпочтительнее использовать реальные макросы вместо макросов:

const int max = 30;
char blah[max];

Другой альтернативой является использование std::string и не иметь жестко заданного предела (следуя правилу ноль-одна-бесконечность).

Да, это законно, но вы можете использовать const int NAME_SIZE = 30;, Это может быть безопасно помещено в заголовочный файл. В отличие от неконстантных глобальных переменных, наличие константных переменных в разных единицах перевода (файлы cpp) не создает проблем для компоновщика, поскольку каждая константа является локальной для файла, в котором она определена.

Другая альтернатива typedef вместо const/define:

typedef char NAMESTR[30];

NAMESTR name1;
NAMESTR name2;
Другие вопросы по тегам