Как восстановить предупреждение: отсутствуют привязки вокруг инициализатора?
Предупреждение создается кодом c, генерируемым vala.
предупреждение: отсутствующие фигурные скобки вокруг инициализатора
Код работает, но предупреждение вызывает раздражение. Код vala, на который указывает предупреждение,
struct Position {uint x; uint y;}
private static Position positions[8];
Сгенерированный код C
static Position det_positions[8] = {0};
Я попытался инициализировать позиции полдюжины различных способов, но не могу заставить синтаксис удовлетворять этому предупреждению. Эта ошибка GCC 53119 или есть способ ее исправить?
Ответы
Ответ 1
Да, похоже, это связано с ошибкой GCC 53119. Он исчезнет, если вы измените объявление C на {{0}}
. Ваши варианты:
- Игнорировать предупреждение.
- Управляйте кодом C после генерации, чтобы
{{0}}
вместо {0}
использовать {0}
в этой строке, используя sed
или тому подобное.
- Объявите массив
extern
в Vala и напишите определение C в другом месте. (Постоянная версия №2.)
- Теперь что-то вроде
struct foo { int bar; Position positions[8]; } static foo position_holder
и {0}
будет инициализироваться position_holder.bar
, что хорошо, и предупреждение уходит.
Ответ 2
Это предупреждение также появляется, когда многомерный массив рассматривается как линейный массив (хотя он по-прежнему корректен и код работает отлично) с установленными флажками -Wall компилятора.
Например
char array[5][10][2] = {\
"0","0","0","0","0","0","0","0","0","0",\
"1","1","1","1","1","1","1","1","1","1",\
"2","2","2","2","2","2","2","2","2","2",\
"3","3","3","3","3","3","3","3","3","3",\
"4","4","4","4","4","4","4","4","4","4" };
Это приведет к появлению предупреждения.
Выполните следующие изменения, чтобы удалить предупреждения, как показано ниже.
char array[5][10][2] = {\
{"0","0","0","0","0","0","0","0","0","0" },\
{"1","1","1","1","1","1","1","1","1","1"},\
{"2","2","2","2","2","2","2","2","2","2"},\
{"3","3","3","3","3","3","3","3","3","3"},\
{"4","4","4","4","4","4","4","4","4","4"} };
Пожалуйста, поправьте меня, если я ошибаюсь.
Ответ 3
// Learn!
// I used ATMEL STUDIO 7
#include <avr/io.h>
typedef struct Position { uint8_t x; uint8_t y;} POSITION_TYPE;
POSITION_TYPE positions[8]={ { 0,0 }, { 0,1 }, { 0,2 }, { 0,3 }, { 0,4 }, { 0,5 }, { 0,6 }, { 0,7 } }; // correct
POSITION_TYPE positions2[8]={ { .x=0, .y=0 },
{ .y=1, .x=0 },
{ .x=0, .y=2 },
{ 0, 3 },
{ 7, .x=4 , 8 }, //7 was automatically .x and was rewritten by .x=4 and following number 8 is .y because automatically after .x follow .y
{ .y=5, .x=0 },
{ 0, 6 },
{ 0, 7 } }; // correct
POSITION_TYPE positions3[8]={ 0 }; // NOT CORRECT! WHY? Becouse this is an array of 8 structures with positions3[index].x and positions3[index].y index=0 .. 7
/*
Warnings for positions3 ->
missing braces around initializer [-Wmissing-braces]
(near initialization for 'positions3[0]') [-Wmissing-braces]
*/
void initPositions3 (void)
{
for (int i=0; i<8; i++) { positions3[i].x=0 ; positions3[i].y=0; }
}
int main(void)
{
while (1)
{
for (int i=0; i<8; i++) { ++positions[i].x ; }
for (int i=0; i<8; i++) { --positions2[i].y ; }
for (int i=0; i<8; i++) { positions3[i].x=i ; positions3[i].y=2*i ;}
}
}