Инициализация 2D-массива в C

#c #multidimensional-array

#c #многомерный массив

Вопрос:

Я пытаюсь инициализировать 2d-массив в следующем коде —

 int main(void)
{
    int arr[][5] = {
        [0][1] : 1, [0][0] : 2, [0][2] : 3,
    };
    cout<<a[0][0]<<" "<<a[0][1]<<endl;

    return 0;
}
 

Но компилятор выдает мне следующую ошибку —

 ./2d-arr.cpp: In function ‘int main()’:
./2d-arr.cpp:7:4: error: expected identifier before numeric constant
   [0][1] : 1, [0][0] : 2, [0][2] : 3,
    ^
./2d-arr.cpp: In lambda function:
./2d-arr.cpp:7:6: error: expected ‘{’ before ‘[’ token
   [0][1] : 1, [0][0] : 2, [0][2] : 3,
      ^
./2d-arr.cpp: In function ‘int main()’:
./2d-arr.cpp:7:6: error: no match for ‘operator[]’ (operand types are ‘main()::<lambda()>’ and ‘int’)
./2d-arr.cpp:7:10: error: expected ‘}’ before ‘:’ token
   [0][1] : 1, [0][0] : 2, [0][2] : 3,
          ^
./2d-arr.cpp: At global scope:
./2d-arr.cpp:9:2: error: ‘cout’ does not name a type
  cout<<a[0][0]<<" "<<a[0][1]<<endl;
  ^~~~
./2d-arr.cpp:11:2: error: expected unqualified-id before ‘returnreturn 0;
  ^~~~~~
./2d-arr.cpp:12:1: error: expected declaration before ‘}’ token
 }
 ^
 

В то время как, если я заменю ‘:’ на ‘=’ и скомпилирую его с помощью gcc, он будет работать нормально.
Насколько я понимаю, после поиска сообщения об ошибке в Google мы не можем инициализировать массив так же, как мы делаем в C.
Можно ли что-нибудь сделать с приведенным выше кодом, чтобы он работал для C ?

Комментарии:

1. С каких пор C позволяет [0][1] : 1 ?

2. @TonyTannous с 1999 года 😉

3. @Quentin вот почему мне ТАК нравится. Вы всегда узнаете что-то новое. Хотя я никогда не видел примера… что я должен искать, чтобы найти некоторые?

4. @TonyTannous они называются назначенными инициализаторами, однако это : расширение компилятора, которое используют стандартные = .

5. @Quentin Я знаю, что назначенные инициализаторы поддерживаются в C99 и были введены в C в C 20. Странной вещью было : то, что, как я теперь понимаю, является расширением компилятора.

Ответ №1:

Я нашел следующий снимок кода отсюда
в котором говорится, что приведенная выше инициализация недопустима для C .

 struct A { int x, y; };
struct B { struct A a; };
struct A a = {.y = 1, .x = 2}; // valid C, invalid C   (out of order)
**int arr[3] = {[1] = 5};        // valid C, invalid C   (array)**
struct B b = {.a.x = 0};       // valid C, invalid C   (nested)
struct A a = {.x = 1, 2};      // valid C, invalid C   (mixed)
 

Невозможно выполнить обозначенную инициализацию с помощью [] в C , как это происходит в C.