| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Глобальное объявление структуры |
| Автор: gggl 13.11.2011, 18:11 | ||
Это код не компилиться - main1.c:12: error: variably modified ‘data’ at file scope если в - char data[max_str_size]; написать вместо max_str_size любое число или же перенести объявление структуры в main все нормально компилиться. В чем может быть причина почему исходный вариант не хочет работать??? |
| Автор: mes 13.11.2011, 18:38 |
enum { max_str_size = 15 }; |
| Автор: gggl 13.11.2011, 18:45 |
| Скомпилилось но выглядит как большой страшный костыль... |
| Автор: gggl 13.11.2011, 19:01 |
| Скорее всего придется использовать #define max_str_size 15 хотя где то слышал что в данном случае лучше так не делать... |
| Автор: math64 13.11.2011, 19:04 | ||
Если пишешь на Си без плюсов, принято так:
не знал что с enum скомпилируется - может, не всеми компиляторами. C const в Си без плюсов компилироваться не должно (в отличие от Си++ - где как раз принято использовать const) В Си без плюсов const оздачает "только для чтения". Проинициализировав константу, компилятор уже не знает о её значении и не будет подставлять её значение при использовании. В C++ наоборот, компилятор помнит значение константы (для простых типов), может использовать её для определения размера массива и будет использовать команду с непосредственной адресацией, если это возможно. |
| Автор: bsa 13.11.2011, 19:05 |
| gggl, обычно, для этого используют динамические массивы... Или std::string, если это C++. |
| Автор: gggl 13.11.2011, 19:22 |
| Извините, пример на С, просто в списке подсветки был только С++ компилятор gcc, значит так и сделаю через дефайн, просто меня удивило что вынеся объявление структуры из main в глобальное пространство программа перестала компилиться, хотя при объявлении ее внутри майн"а все компилилось, значит это просто особенность gcc... Значит правильно я понял что в Си const принадлежит к run-time а в С++ compile-time? или же это опять особенность компилятора? |
| Автор: math64 13.11.2011, 23:10 |
Это не костыль. Просто разработчики первой версии C++ хотели минимизировать число новых ключевых слов. const имеет два значения: 1 - то что было в C - переменная доступна только для чтения (в C# для этого используется слово readonly) 2 - переменная - константа (в C# это const). Следовало бы добавить новое ключевое слово, как это сделано в C#, но нужна была совместимость с C. но всё же в C++ const соответсвует в C не const, а static const, иначе константы нельза было бы объявлать в заголовке. Для объявления переменной нужно писать extern const. |
| Автор: mes 13.11.2011, 23:32 | ||||
Добавлено через 4 минуты и 44 секунды
совместимость в несовместимом поведении ? в C++11 наконец то осознали и подправили сие недаразуменее нормальным constexpr.. |