gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 08:22
Оценка:
есть такой, прекрасно работающий на clang код:

#include <stdio.h>

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

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

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


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

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


к сожалению развернуть 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 СССР  
Дата: 25.05.17 08:29
Оценка: -1
Здравствуйте, Quarter-123, Вы писали:

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>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?

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

Mdata   dt = { 1, "123" };
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 25.05.2017 8:32 rg45 . Предыдущая версия .
Re: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 08:35
Оценка: 5 (1)
проблема не в константе.
http://coliru.stacked-crooked.com/a/0e91de7d58bb27da
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 08:46
Оценка:
Здравствуйте, rg45, Вы писали:

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


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>>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?

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


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


Увы, даже вот так валится

 gcc -o test_array test_array.c
test_array.c:8:7: error: variably modified 'buf' at file scope
  char buf[SZ];
       ^~~
$ cat test_array.c
#include <stdio.h>

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

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

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



должно быть какое-то расширение, которое заставит gcc поддерживать стандарт (?) clang, но я не могу его найти.
Re[3]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 08:50
Оценка:
Здравствуйте, 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> ^~~

либо баг компилятора, либо я хз...
у меня даже в Си режиме компилится этот код:
http://coliru.stacked-crooked.com/a/b9b1b7452ce3547d
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 08:55
Оценка:
Здравствуйте, 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 СССР  
Дата: 25.05.17 08:56
Оценка:
Здравствуйте, Quarter-123, Вы писали:

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


Q1>Увы, даже вот так валится


То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.
А если так:
static constexpr int SZ = 100;

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

Q1>А какая у вас версия gcc/OS?

сорри, мой косяк, ввел в заблуждение %)

вот правильный тест:
http://coliru.stacked-crooked.com/a/d20f1d4624cb547b
и да, не компилится. GCC-7.1.0.

вот фикс:
http://coliru.stacked-crooked.com/a/4971e04b243d9395
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 09:00
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>static constexpr int SZ = 100;

а разве constexpr есть в сях? оО
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 09:03
Оценка: +1
Здравствуйте, 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: якобы "переменнные" размеры массивов в структуре
От: rg45 СССР  
Дата: 25.05.17 09:03
Оценка:
Здравствуйте, niXman, Вы писали:

R>>static constexpr int SZ = 100;

X>а разве constexpr есть в сях? оО

Пардон, ступил. Рефлексы-с
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 09:08
Оценка:
Здравствуйте, niXman, Вы писали:

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


Q1>>А какая у вас версия gcc/OS?

X>сорри, мой косяк, ввел в заблуждение %)

X>вот правильный тест:

X>http://coliru.stacked-crooked.com/a/d20f1d4624cb547b
X>и да, не компилится. GCC-7.1.0.

X>вот фикс:

X>http://coliru.stacked-crooked.com/a/4971e04b243d9395



Ну вот, значит уже общий знаменатель есть

Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.
Re[7]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 09:14
Оценка:
Здравствуйте, Quarter-123, Вы писали:

Q1>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.

в Си нет других констант, кроме enum. так что я хз...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.05.17 09:15
Оценка:
Здравствуйте, Quarter-123, Вы писали:

Q1>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.

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

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


Q1>>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.

X>а чем enum не подходит? это тоже интегральний тип, его можно использовать так же, как и const int.


безусловно, равно как и определить через #define, но это достаточно некислое изменение многих файлов. Чего бы крайне не хотелось.
Re[7]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: rg45 СССР  
Дата: 25.05.17 09:47
Оценка:
Здравствуйте, Quarter-123, Вы писали:

Q1>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.


Да уж, вопрос стоит так, что в С не работает даже предельно упрощенный вариант:

http://ideone.com/uHFQYX
static const int SZ = 100;
char str[SZ] = "Hello";

prog.c:4:6: error: variably modified ‘str’ at file scope
 char str[SZ] = "Hello";
      ^~~
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[8]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 10:03
Оценка:
Здравствуйте, rg45, Вы писали:

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


Q1>>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.


R>Да уж, вопрос стоит так, что в С не работает даже предельно упрощенный вариант:


R>http://ideone.com/uHFQYX

R>
R>static const int SZ = 100;
R>char str[SZ] = "Hello";
R>

R>
R>prog.c:4:6: error: variably modified ‘str’ at file scope
R> char str[SZ] = "Hello";
R>      ^~~
R>



я бы сказал таки в gcc, в clang всё работает и, как я понимаю, по С11 должно работать.
Re[4]: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Zhendos  
Дата: 25.05.17 10:10
Оценка: 1 (1)
Здравствуйте, rg45, Вы писали:

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


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


Q1>>Увы, даже вот так валится


R>То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.


А что в этом странного? В C `const` это просто readonly, это не константа времени
выполнения:

https://stackoverflow.com/questions/34997660/defining-the-size-of-an-array-using-a-const-int
https://stackoverflow.com/questions/18848537/can-a-const-variable-be-used-to-declare-the-size-of-an-array-in-c
Re: gcc 6: якобы "переменнные" размеры массивов в структуре
От: Zhendos  
Дата: 25.05.17 10:14
Оценка:
Здравствуйте, 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 признать, что константа это константа и создать структуру?



Насколько я знаю нет, использование `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: якобы "переменнные" размеры массивов в структуре
От: Quarter-123 Россия  
Дата: 25.05.17 10:17
Оценка:
Здравствуйте, Zhendos, Вы писали:

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


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


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


Q1>>>Увы, даже вот так валится


R>>То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.


Z>А что в этом странного? В C `const` это просто readonly, это не константа времени

Z>выполнения:

Z>https://stackoverflow.com/questions/34997660/defining-the-size-of-an-array-using-a-const-int

Z>https://stackoverflow.com/questions/18848537/can-a-const-variable-be-used-to-declare-the-size-of-an-array-in-c


Допустим, не хочу тут софистики. Как-то (ключ?) можно заставить gcc сжевать это?

Очевидно все данные для создания типа у него есть, а если я каким-то образом в ран-тайме изменю содержимое SZ — это мои проблемы.
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...
Пока на собственное сообщение не было ответов, его можно удалить.