Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Глобальное объявление структуры


Автор: gggl 13.11.2011, 18:11
Код

#include <stdio.h>
#include <stdlib.h>

#include <stddef.h>
#include <stdint.h>

const int table_size = 4096;
const unsigned max_str_size = 15;

struct list
    {
        char data[max_str_size];
        struct list *next;
    };

int main(void)
{
    return 0;
}

Это код не компилиться - 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
Цитата(gggl @  13.11.2011,  17:11 Найти цитируемый пост)
const unsigned max_str_size = 15;

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
Если пишешь на Си без плюсов, принято так:
Код

#define MAX_STR_SIZE 15

struct list
    {
        char data[MAX_STR_SIZE];
        struct list *next;
    };

не знал что с 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? или же это опять особенность компилятора?

Автор: mes 13.11.2011, 19:56
Цитата(gggl @  13.11.2011,  18:22 Найти цитируемый пост)
Значит правильно я понял что в Си const принадлежит к run-time а в С++ compile-time? или же это опять особенность компилятора?

нет неправильно.. C++ имеет костыль, когда сохраняет (параллельно переменной) значение инициализации,  которое позволяет использовать для указания размера массива.

Добавлено через 1 минуту и 23 секунды
Цитата(gggl @  13.11.2011,  17:45 Найти цитируемый пост)
Скомпилилось но выглядит как большой страшный костыль..

Цитата(gggl @  13.11.2011,  18:22 Найти цитируемый пост)
 значит так и сделаю через дефайн 

ну да, через дефайн не костыль.. smile 

Автор: math64 13.11.2011, 23:10
Цитата(mes @  13.11.2011,  19:56 Найти цитируемый пост)
C++ имеет костыль

Это не костыль. Просто разработчики первой версии 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
Цитата(math64 @  13.11.2011,  22:10 Найти цитируемый пост)
Это не костыль. 

 smile  ну если только притянутое за уши - не костыль..
Цитата

An integral constant-expression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types  initialized with constant expressions (8.5), non-type template parameters of integral or enumeration types, and sizeof expressions. 


Добавлено через 4 минуты и 44 секунды
Цитата(math64 @  13.11.2011,  22:10 Найти цитируемый пост)
Следовало бы добавить новое ключевое слово, как это сделано в C#, но нужна была совместимость с C.

совместимость в несовместимом поведении ? в C++11 наконец то осознали и подправили сие недаразуменее нормальным constexpr.. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)