2013-10-09 3 views
4

Я знаю, что я могу инициализировать структуру в C99 с назначенным инициализатором, как это:Места инициализации инициализируются структур

typedef struct 
{ 
    char a; 
    char b; 
    int c; 

} MyStruct; 

MyStruct s = {.a = 1, .b = 2, .c = 3}; 

(этот код не работает в моем C++ компилятора, но (русский) википедия говорит, что нужно)

Но некоторые странные код причины, как это будет также компилировать (и работать, как ожидалось):

typedef struct 
{ 
    char a; 
    char b; 
    int c; 

} MyStruct; 


MyStruct arr[5]; 

int main(void) 
{ 
    arr[0] = (MyStruct){.a = 1, .b = 2, .c = 0x332211}; 
} 

я предположил, что инициализация должна работать только тогда, когда О.Б. ject создается, а не потом.

Это поведение, подобное этому, или это какой-то компилятор причуды? Должна ли она работать на C++? Что это такое в фигурных скобках? Какая-то временная неназванная структура? Я использую Keil uVision 4 (и назначенный инициализатор не работает в режиме C++).

+1

Какой у вас компилятор? НКУ? –

+1

Пожалуйста, добавьте эту ссылку в Wikipedia. Кроме того, вы действительно спрашиваете о двух языках (C и C++)? –

+0

@YuHao мой компилятор Keil uVision (как я уже писал выше) – Amomum

ответ

6

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

Вторая конструкция представляет собой «составной литерал», снова элемент C, который не является частью C++. Поэтому компилятор C++ должен отклонить это, в то время как компилятор C99 (или более поздний) должен принимать оба фрагмента.

2

Designated Initializers являются особенностью C99 но похоже clang и gcc поддерживают их в C++ как расширение, хотя gcc документ утверждает, что в противном случае. Если я строю это с clang использованием -pedantic флага он говорит:

warning: designated initializers are a C99 feature [-Wc99-extensions] 

и gcc предупреждает:

warning: ISO C++ does not allow C99 designated initializers [-Wpedantic] 

В C++ есть конструкторы, которые позволят вам инициализировать -структуру в чистый способ.

Второй пример использует Compound Literals, а также является функцией C99, которая поддерживается как расширение.

4

Designated Initializer (в первом примере) и Compound Literals (во втором примере), оба введены в C99, C++ еще не поддерживает их.

Однако некоторые компиляторы могут поддерживать эти функции на C++ в качестве расширения. Например, gcc поддерживает Составные литералы в C++, но не Обозначенный инициализатор. Кажется, что ваш компилятор делает то же самое.

Смежные вопросы