Как назначить встроенную структуру C? - PullRequest
39 голосов
/ 24 января 2011
typedef struct {
    int hour;
    int min;
    int sec;
} counter_t;

И в коде я хотел бы инициализировать экземпляры этой структуры без явной инициализации каждой переменной-члена. То есть я хотел бы сделать что-то вроде:

counter_t counter;
counter = {10,30,47}; //doesn't work

для 10:30: 47

вместо

counter.hour = 10;
counter.min = 30;
counter.sec = 47;

Не вызывайте синтаксис для этого, и не сразу нашли способ сделать это из Google.

Спасибо!

Ответы [ 2 ]

75 голосов
/ 24 января 2011

Инициализация:

counter_t c = {10, 30, 47};

Назначение:

c = (counter_t){10, 30, 48};

Последний называется «составной литерал».

16 голосов
/ 10 июня 2017

Для удобства обслуживания я предпочитаю синтаксис списка С явно идентифицированными переменными, например:

counter_t counter = {.hour = 10, .min = 30, .sec = 47};

или для возврата в строку, например:

return (struct counter_t){.hour = 10, .min = 30, .sec = 47};

Я могу представить себеСценарий, в котором можно изменить порядок, в котором объявлены переменные, и, если вы явно не идентифицируете свои переменные, вам придется пройти весь код, чтобы исправить порядок переменных.Таким образом, он становится чище и читабельнее. Думаю,

Примечание :

Как сказали @AshleyDuncan и @MM, эта функция была удаленаиз ISO C ++ после C99 https://stackoverflow.com/a/12122261/2770195, но поддерживается в GNU C ++.

Так что пока вы можете сделать это просто отлично:

g++ -std=gnu++11 main.cpp -o main

Это выдаст ошибку, если вы попробуете приведенный выше пример:

# need an example. I was unable to find. Even clang++ supports it. If you know 
# one, please suggest an edit

Если вам нужно скомпилироватьс компилятором C ++ с поддержкой ISO C ++ 11 или более поздней версии, который не распознает это расширение GNU, вам, возможно, придется использовать класс с простым конструктором:

// backup workaround
// not cool
class gnuFTW {
public:
    int hour;
    int min;
    int sec;
    gnuFTW(int hour, int min, int sec) {
        this->hour = hour;
        this->min = min;
        this->sec = sec;
    }   
};

int main(int argc, const char * argv[]) {
    gnuFTW counter = gnuFTW(10,30,47);
    cout << counter.hour << endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...