Неявная инициализация совокупного субпроекта - PullRequest
1 голос
/ 05 октября 2019

При просмотре правил инициализации для агрегатов в N2310 я обнаружил следующие абзацы (emp. Mine):

6.7.9(p19):

Инициализация должна происходить в инициализаторепорядок списков, каждый инициализатор предоставляется для конкретного подобъекта, перекрывая любой ранее указанный инициализатор для того же подобъекта;154) все подобъекты, которые не инициализированы явно, должны быть инициализированы неявно так же, как объекты, имеющие статическую продолжительность хранения.

6.7.9(p21):

Если в заключенном в скобки списке меньше инициализаторов, чем элементов или членов агрегата, либо меньше символов в строковом литерале, используемом для инициализации массива известного размера, чемв массиве есть элементы, остаток агрегата должен инициализироваться неявно так же, как объекты со статическим хранилищем duration .

Мне кажется, что 6.7.9(p19) подразумевает 6.7.9(p21) (но не наоборот). Например:

#include <stdio.h>

struct test{
    int a;
    int b;
    int c;
};

int main(){
    struct test test = {
        .a = 123
    };

    printf("%d%d%d\n", test.a, test.b, test.c); //obviously, 12300 is printed
}

Я думаю, что этот случай можно объяснить как 6.7.9(p19), так и 6.7.9(p21)

Какова цель 6.7.9(p21)? Что я пропустил?

1 Ответ

2 голосов
/ 05 октября 2019

6.7.9 учитывает так называемые назначенные инициализаторы.

Рассмотрим следующую демонстрационную программу

#include <stdio.h>

struct test{
    int a;
    int b;
    int c;
};

int main(void) 
{
    struct test test = {
        .c = 123
    };

    printf("%d %d %d\n", test.a, test.b, test.c);

    return 0;
}

Ее вывод

0 0 123

Или другойprogram

#include <stdio.h>

int main(void) 
{
    enum { N = 10 };
    int a[N] = { [0] = 0, [4] = 4, [9] = 9 };

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    return 0;
}

Выходные данные

0 0 0 0 4 0 0 0 0 9

Итак

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

Вторая цитата существовала до того, как назначенные инициализаторы были приняты в Стандарте C, и описывает ситуацию, например, такую ​​как

char s[20] = "Hello";

иотвечает на вопрос, будет ли инициализирован хвост массива символов. Он поддерживает совместимость со стандартом C ++, где указанные инициализаторы отсутствовали, до появления стандарта C ++ 17.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...