Re[2]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 10:21
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, Quarter-123, Вы писали:


Q1>>есть такой, прекрасно работающий на clang код:


Q1>>
Q1>>#include <stdio.h>

Q1>>static const int                SZ = 100;
Q1>>// #define                                      SZ 100

Q1>>typedef struct Mdata {
Q1>>        int             status;
Q1>>        char    buf[SZ];
Q1>>} Mdata;

Q1>>int             
Q1>>main(void)
Q1>>{
Q1>>        Mdata   dt = {.status = 1, .buf = "123" };
Q1>>        printf("%d - %s\n", dt.status, dt.buf);
Q1>>}
Q1>>


Q1>>однако gcc 6.3.0 отказывается его компилировать с вот такой замечательной ошибочкой:


Q1>>
Q1>>test_array.c:8:7: error: variably modified 'buf' at file scope
Q1>>  char buf[SZ];
Q1>>       ^~~
Q1>>


Q1>>к сожалению развернуть llvm на этом устройстве (uname -a

Q1>>Linux nserv 3.10.102 #15101 SMP Mon May 22 10:01:45 CST 2017 armv7l GNU/Linux synology_armada38x_ds116 ) пока невозможно,

Q1>>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?



Z>Насколько я знаю нет, использование `const` в качестве размера массива не соотвествует стандарту,

Z>`clang` то со скрипом можно заставить не принимать этот код:
Z>`clang -std=c11 -pedantic -Werror test.c`

Z>А среди расшерений языка С не соотвествующих стандарту нет ничего подходящего: https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html

Z>Единственный вариант переписать код в соответствии со стандартом или компилировать C код C++ компилятором (g++).



либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.
Re[3]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 10:23
Оценка: +1
Здравствуйте, Quarter-123, Вы писали:

Q1>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.

ну да. стандарты пишут идиоты. не ровень вам.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 10:45
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Quarter-123, Вы писали:


Q1>>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.

X>ну да. стандарты пишут идиоты. не ровень вам.

Давайте пожалуйста без оскорблений, ок?
Re[5]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 11:00
Оценка: -1
Здравствуйте, Quarter-123, Вы писали:

Q1>Давайте пожалуйста без оскорблений, ок?

а оскорблений не было, с какой стороны не посмотри...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Zhendos  
Дата: 25.05.17 16:10
Оценка:
Здравствуйте, Quarter-123, Вы писали:

Q1>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.


Ну, код который скомпилирует любой компилятор все-таки лучше, чем код который способен
проглотить только один единственный компилятор, можно еще так написать:

#define SZ ((int)100)


и типобезопасность и код будет компилироваться.
Re: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Tilir Россия http://tilir.livejournal.com
Дата: 26.05.17 07:38
Оценка:
Здравствуйте, Quarter-123, Вы писали:

Q1>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?


Это не константа.

Sounds odd? Сейчас станет яснее. Модификатор const не означает, что помеченный им объект является константой времени компиляции (иначе не имели бы смысла const volatile переменные). Он всего лишь означает, что это ВЫ ничего не можете туда записать.

Ок. Как сделать константу времени компиляции? Очень просто: define или enum или constexpr в C++.

Так что в данном случае clang не прав, а gcc право.
Re[2]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 26.05.17 08:14
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Здравствуйте, Quarter-123, Вы писали:


Q1>>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?


T>Это не константа.


T>Sounds odd? Сейчас станет яснее. Модификатор const не означает, что помеченный им объект является константой времени компиляции (иначе не имели бы смысла const volatile переменные). Он всего лишь означает, что это ВЫ ничего не можете туда записать.


К сожалению, судя по всему, вы правы, недоработка стандарта какая-то. По крайней мере looks like.
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 26.05.17 08:15
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, Quarter-123, Вы писали:


Q1>>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.


Z>Ну, код который скомпилирует любой компилятор все-таки лучше, чем код который способен

Z>проглотить только один единственный компилятор, можно еще так написать:

Z>
Z>#define SZ ((int)100)
Z>


Z>и типобезопасность и код будет компилироваться.


Согласен, просто хотелось какой-нибудь ключик совместимости... ну ничего, прорвёмся
Re[2]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: AlexGin Беларусь  
Дата: 09.06.17 10:29
Оценка: 10 (1)
Здравствуйте, rg45, Вы писали:

R>У меня есть смутные подозрения, что дело не в константе. Проверь, пожалуйста, устраняется ли проблема в таком варианте:


R>
R>Mdata   dt = { 1, "123" };
R>

Да, это даёт эффект для MS компиляторов!
Так, для MSVC2015 — это убрало ошибки компиляции.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.