Использование назначенного инициализатора для инициализации вложенной структуры с членом `char []` - PullRequest
3 голосов
/ 18 марта 2020

У меня есть следующее вложенное struct определение:

typedef struct {
    int count;
    float cash;
    char item[50];//switch between array and pointer for testing initializers
    //char *item;
}Purchase;

typedef struct {
    int accnt;
    char acct_name[50];
    Purchase purch;
} Acct;

Где для Purchase struct само по себе работает следующий инициализатор:

//Uses member names:
/* 1 */Purchase p = {.count = 4, .cash = 12.56, .item = "thing"};
//  Note: this member:                          ^^^^^^^^^^^^^^^

И для вложенной структуры Acct работает следующее:

// No member names:
/* 2 */Acct acct = {100123, "Robert Baily", {15, 12.50, "Tires"}};
//                                                      ^^^^^^^

но когда я пытаюсь использовать имя члена, как в первом примере:

// Attempts to use member name, but fails the last one:
/* 3 */Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", {acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}};
// error occurs here ->                                                                                                                ^

Я получаю эту ошибку: 22, 131 error: array type 'char [50]' is not assignable когда используя элемент char item[50]; in Покупка`

И я получаю эту ошибку: 22, 14 error: initializer element is not a compile-time constant При использовании элемента char *item; в Purchase (Обратите внимание, что только одна версия item является частью struct в любом один раз другой комментируется)

Итак, в итоге, я могу инициализировать вложенную структуру хорошо, если не использовать именованные операторы присваивания, как в операторе /* 2 */ выше, но когда я пытаюсь использовать именованные присваивания, как показано для char [] типов в операторе /* 3 */ происходит сбой.

Чего мне не хватает для инициализации char [] или char *, когда он является членом внутренней структуры вложенной структуры struct?

Я использую CLANG, установленный на C99

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Вы пытаетесь скомпилировать:

Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", 
           {acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}};

Этот инициализатор недопустим, поскольку acct3.purch не является именем поля Purchase. При инициализации вы используете только самые внутренние имена полей.

Acct acct3 = {.accnt = 100123, .acct_name = "Robert Baily", 
              .purch = {.count = 15, .cash = 12.50, .item = "Tires"}};
0 голосов
/ 18 марта 2020

Ни структура Acct, ни структура Purchase не имеют имени элемента данных acct3. Так что этот список инициализатора для переменной Acct acct3

{acct3.purch.count = 15, acct3.purch.cash = 12.50, acct3.purch.item = "Tires"}

недействителен.

Принимая во внимание сообщение об ошибке, компилятор считает такую ​​часть списка инициализатора, как этот

acct3.purch.item = "Tires"

как назначение элемента-члена данных объекта acct3, и массивы не имеют оператора присваивания, поскольку они являются немодифицируемыми l-значениями.

...