#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 ‘return’
return 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.