Ответ 1
Инициализация:
counter_t c = {10, 30, 47};
Назначение:
c = (counter_t){10, 30, 48};
Последний называется "составным литералом".
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;
Не помните синтаксис для этого и не сразу нашли способ сделать это из Googling.
Спасибо!
Инициализация:
counter_t c = {10, 30, 47};
Назначение:
c = (counter_t){10, 30, 48};
Последний называется "составным литералом".
Для удобства обслуживания я предпочитаю синтаксис списка С явно идентифицированными переменными, как показано ниже:
counter_t counter = {.hour = 10, .min = 30, .sec = 47};
или для возврата в строку, например:
return (struct counter_t){.hour = 10, .min = 30, .sec = 47};
Я могу представить сценарий, в котором каждый изменяет порядок, в котором объявляются переменные, и если вы явно не определяете свои переменные, вам придется пройти весь код, чтобы исправить порядок переменных. Таким образом, он чище и читабельнее, я думаю,
Побочное примечание
Как и @AshleyDuncan и @M.M, эта функция была удалена из ISO С++ после C99 fooobar.com/info/154073/..., но поддерживается в gnu С++.
Итак, пока вы можете сделать это просто отлично:
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
Если вам нужно скомпилировать компилятор С++ с поддержкой ISO С++ 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;
}