к сожалению развернуть llvm на этом устройстве (uname -a
Linux nserv 3.10.102 #15101 SMP Mon May 22 10:01:45 CST 2017 armv7l GNU/Linux synology_armada38x_ds116 ) пока невозможно,
соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?
Re: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Quarter-123, Вы писали:
Q1>>однако gcc 6.3.0 отказывается его компилировать с вот такой замечательной ошибочкой: Q1>>
Q1>>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?
R>У меня есть смутные подозрения, что дело не в константе. Проверь, пожалуйста, устраняется ли проблема в таком варианте:
R>
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Quarter-123, Вы писали:
Q1>>Увы, даже вот так валится
Q1>>[ccode] Q1>> gcc -o test_array test_array.c Q1>>test_array.c:8:7: error: variably modified 'buf' at file scope Q1>> char buf[SZ]; Q1>> ^~~
X>либо баг компилятора, либо я хз... X>у меня даже в Си режиме компилится этот код: X>http://coliru.stacked-crooked.com/a/b9b1b7452ce3547d
А какая у вас версия gcc/OS?
Re[3]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Quarter-123, Вы писали:
R>>>
R>>>Mdata dt = { 1, "123" };
R>>>
Q1>>Увы, даже вот так валится
R>То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно. R>А если так: R>
R>static constexpr int SZ = 100;
R>
R>?
Именно. Про макросы то компилятор не знает...
с constexpr ожидаемо валится ввиду непонятного ключевого слова
Re[5]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Quarter-123, Вы писали:
Q1>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.
в Си нет других констант, кроме enum. так что я хз...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Quarter-123, Вы писали:
Q1>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.
а чем enum не подходит? это тоже интегральний тип, его можно использовать так же, как и const int.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Quarter-123, Вы писали:
Q1>>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать. X>а чем enum не подходит? это тоже интегральний тип, его можно использовать так же, как и const int.
безусловно, равно как и определить через #define, но это достаточно некислое изменение многих файлов. Чего бы крайне не хотелось.
Re[7]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Quarter-123, Вы писали:
Q1>>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.
R>Да уж, вопрос стоит так, что в С не работает даже предельно упрощенный вариант:
R>http://ideone.com/uHFQYX R>
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 признать, что константа это константа и создать структуру?
Насколько я знаю нет, использование `const` в качестве размера массива не соотвествует стандарту,
`clang` то со скрипом можно заставить не принимать этот код:
`clang -std=c11 -pedantic -Werror test.c`
А среди расшерений языка С не соотвествующих стандарту нет ничего подходящего: https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
Единственный вариант переписать код в соответствии со стандартом или компилировать C код C++ компилятором (g++).
Re[5]: gcc 6: якобы "переменнные" размеры массивов в структуре
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: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Quarter-123, Вы писали:
Q1>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.
ну да. стандарты пишут идиоты. не ровень вам.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Quarter-123, Вы писали:
Q1>>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо. X>ну да. стандарты пишут идиоты. не ровень вам.
Давайте пожалуйста без оскорблений, ок?
Re[5]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Quarter-123, Вы писали:
Q1>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.
Ну, код который скомпилирует любой компилятор все-таки лучше, чем код который способен
проглотить только один единственный компилятор, можно еще так написать:
#define SZ ((int)100)
и типобезопасность и код будет компилироваться.
Re: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Quarter-123, Вы писали:
Q1>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?
Это не константа.
Sounds odd? Сейчас станет яснее. Модификатор const не означает, что помеченный им объект является константой времени компиляции (иначе не имели бы смысла const volatile переменные). Он всего лишь означает, что это ВЫ ничего не можете туда записать.
Ок. Как сделать константу времени компиляции? Очень просто: define или enum или constexpr в C++.
Так что в данном случае clang не прав, а gcc право.
Re[2]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Tilir, Вы писали:
T>Здравствуйте, Quarter-123, Вы писали:
Q1>>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?
T>Это не константа.
T>Sounds odd? Сейчас станет яснее. Модификатор const не означает, что помеченный им объект является константой времени компиляции (иначе не имели бы смысла const volatile переменные). Он всего лишь означает, что это ВЫ ничего не можете туда записать.
К сожалению, судя по всему, вы правы, недоработка стандарта какая-то. По крайней мере looks like.
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, Quarter-123, Вы писали:
Q1>>либо просто поставить clang и забыть про все эти высосанные из пальца ошибки. Спасибо.
Z>Ну, код который скомпилирует любой компилятор все-таки лучше, чем код который способен Z>проглотить только один единственный компилятор, можно еще так написать:
Z>
Z>#define SZ ((int)100)
Z>
Z>и типобезопасность и код будет компилироваться.
Согласен, просто хотелось какой-нибудь ключик совместимости... ну ничего, прорвёмся
Re[2]: gcc 6: якобы "переменнные" размеры массивов в структуре
Здравствуйте, rg45, Вы писали:
R>У меня есть смутные подозрения, что дело не в константе. Проверь, пожалуйста, устраняется ли проблема в таком варианте:
R>
R>Mdata dt = { 1, "123" };
R>
Да, это даёт эффект для MS компиляторов!
Так, для MSVC2015 — это убрало ошибки компиляции.