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