Инициализация структуры по именованным членам - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь обернуть голову вокруг синтаксиса, представленного в http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc03strin.htm:

struct
{
    int a[5], b;
} game[] =
{
    [0].a = { 1 },
    [1].a[0] = 2
};

В идеале я бы нашел способ сделать следующее:

struct
{
    int a, b;
} foo =
{
    .a = 4,
    .b = 5
};

Моя причина желать инициализации структуры по имени состоит в том, что в моей собственной структуре много членов, поэтому я хочу большей ясности. Я не должен просто инициализировать их в отдельных инструкциях, потому что это чувствительное к производительности встроенное приложение, члены которого на самом деле являются битовыми полями, поэтому одна структура struct init генерирует меньше инструкций, чем инициализация нескольких членов.

Какой стандарт C допускает инициализацию именованного члена таким образом?

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Не сразу понятно, о чем вы спрашиваете, но с компилятором c99 ваша первая попытка может быть записана как

struct
{
    int a[5], b;
} game[] =
{
    [0] = {.a = { 1 }},
    [1] = {.a[0] = 2}

};
1 голос
/ 15 июля 2011

Я делаю нечто подобное во встроенном приложении под C99. У меня есть переменная с именем phaseInstill , которая «назначена» на структуру:

    phaseInstill = (PhaseVolumeStatus)
    {
        .complete = false,
        .ticksInstilled = 0,
        .volumeInstilled = 0,
        .volumeRemaining = instillVolume
    };

Где PhaseVolumeStatus определяется как:

typedef struct
{
    Value volumeRemaining;              /*!> ml */  
    Value volumeInstilled;              /*!> ml */
    Value ticksInstilled;               /*!> ticks */

    bool complete;
} PhaseVolumeStatus;

У меня нет удобного примера с битовым полем, но я не помню, чтобы он работал по-другому в любом другом моем использовании.

...