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;
不要回忆这个问题的语法,也没有立即通过谷歌搜索找到一种方法。
谢谢!
答案 0 :(得分:73)
初始化:
counter_t c = {10, 30, 47};
分配:
c = (counter_t){10, 30, 48};
后者被称为“复合文字”。
答案 1 :(得分:14)
为了可维护性,我更喜欢列表语法WITH明确标识的变量,如下所示:
counter_t counter = {.hour = 10, .min = 30, .sec = 47};
或返回内联,例如:
return (struct counter_t){.hour = 10, .min = 30, .sec = 47};
我可以想象一个场景,其中一个更改声明变量的顺序,如果您没有明确标识您的变量,则必须通过所有代码来修复变量的顺序。这样,我认为它更干净,更具可读性
<强>侧面注意:
正如@AshleyDuncan和@ M.M所说,在C99 https://stackoverflow.com/a/12122261/2770195之后,此功能已从ISO C ++中删除,但在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
如果需要使用支持ISO C ++ 11或更高版本且无法识别此gnu扩展的C ++编译器进行编译,则可能必须使用具有简单构造函数的类:
// 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;
}