![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
gggl |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.9.2007 Репутация: нет Всего: нет |
Это код не компилиться - main1.c:12: error: variably modified ‘data’ at file scope если в - char data[max_str_size]; написать вместо max_str_size любое число или же перенести объявление структуры в main все нормально компилиться. В чем может быть причина почему исходный вариант не хочет работать??? Это сообщение отредактировал(а) gggl - 13.11.2011, 18:14 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
gggl |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.9.2007 Репутация: нет Всего: нет |
Скомпилилось но выглядит как большой страшный костыль...
|
|||
|
||||
gggl |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.9.2007 Репутация: нет Всего: нет |
Скорее всего придется использовать #define max_str_size 15
хотя где то слышал что в данном случае лучше так не делать... |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Если пишешь на Си без плюсов, принято так:
не знал что с enum скомпилируется - может, не всеми компиляторами. C const в Си без плюсов компилироваться не должно (в отличие от Си++ - где как раз принято использовать const) В Си без плюсов const оздачает "только для чтения". Проинициализировав константу, компилятор уже не знает о её значении и не будет подставлять её значение при использовании. В C++ наоборот, компилятор помнит значение константы (для простых типов), может использовать её для определения размера массива и будет использовать команду с непосредственной адресацией, если это возможно. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
gggl, обычно, для этого используют динамические массивы... Или std::string, если это C++.
|
|||
|
||||
gggl |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.9.2007 Репутация: нет Всего: нет |
Извините, пример на С, просто в списке подсветки был только С++
компилятор gcc, значит так и сделаю через дефайн, просто меня удивило что вынеся объявление структуры из main в глобальное пространство программа перестала компилиться, хотя при объявлении ее внутри майн"а все компилилось, значит это просто особенность gcc... Значит правильно я понял что в Си const принадлежит к run-time а в С++ compile-time? или же это опять особенность компилятора? Это сообщение отредактировал(а) gggl - 13.11.2011, 19:26 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
нет неправильно.. C++ имеет костыль, когда сохраняет (параллельно переменной) значение инициализации, которое позволяет использовать для указания размера массива. Добавлено через 1 минуту и 23 секунды ну да, через дефайн не костыль.. ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Это не костыль. Просто разработчики первой версии C++ хотели минимизировать число новых ключевых слов. const имеет два значения: 1 - то что было в C - переменная доступна только для чтения (в C# для этого используется слово readonly) 2 - переменная - константа (в C# это const). Следовало бы добавить новое ключевое слово, как это сделано в C#, но нужна была совместимость с C. но всё же в C++ const соответсвует в C не const, а static const, иначе константы нельза было бы объявлать в заголовке. Для объявления переменной нужно писать extern const. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
![]()
Добавлено через 4 минуты и 44 секунды
совместимость в несовместимом поведении ? в C++11 наконец то осознали и подправили сие недаразуменее нормальным constexpr.. Это сообщение отредактировал(а) mes - 13.11.2011, 23:33 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |