реклама на сайте
подробности

 
 
> Объявление глобального массива в C, длина которого константная переменная
Grizzzly
сообщение Nov 26 2017, 15:37
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748



Удивлен, что компилятор Keil с включенным стандартом C99 не выдал ошибки для такого кода:

Код
const uint32_t N = 20;
static MyStruct_t Example[N];


В C в отличие от C++ const означает только read-only. Variable length array, появившийся в C99, применяется к локальным массивам в run-time.
Почему в моем случае нет ошибки для глобального массива? Странное поведение.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
gazpar
сообщение Nov 26 2017, 16:44
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 9-01-14
Пользователь №: 79 952



Цитата(Grizzzly @ Nov 26 2017, 18:37) *
Удивлен, что компилятор Keil с включенным стандартом C99 не выдал ошибки для такого кода:

Код
const uint32_t N = 20;
static MyStruct_t Example[N];


В C в отличие от C++ const означает только read-only. Variable length array, появившийся в C99, применяется к локальным массивам в run-time.
Почему в моем случае нет ошибки для глобального массива? Странное поведение.

Странно, почему для вас этот код странный. Всё ок. Попробуйте изменить значение N в рантайме (в цикле N присвоить значение индекса/итерации цикла)--> будет ошибка.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 26 2017, 17:13
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(gazpar @ Nov 26 2017, 19:44) *
. . . Попробуйте изменить значение N в рантайме (в цикле N присвоить значение индекса/итерации цикла)--> будет ошибка.
. . .
const с инициализацией размещается или во флеш, или реализуется оптимизатором как присваивание (если использование "разовое").Поэтому, если у компилятора есть совесть, до рантайма дойти не должно. Должна быть ошибка компилятора.
Цитата(Grizzzly @ Nov 26 2017, 19:51) *
. . . . Почему тогда приводятся во всех книгах/примерах определения размеров массивов через define? . . .

Это не "определение", это "тупо подстановка" текста-цифров.
Через #define - тк далее в коде это значение может еще много-где понадобиться (и измениться),
а это удобно делать "централизованно" из одного #define.
------
А для "определения" - sizeof(). И такая конструкция вроде прокатывает:
Код
int a, b; float c; char ms[100];
const int bf_size = sizeof(a) + sizeof(b) + sizeof(ms);
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 14:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016