如何内联分配C结构?

min*_*ief 40 c c++ struct

typedef struct {
    int hour;
    int min;
    int sec;
} counter_t;
Run Code Online (Sandbox Code Playgroud)

在代码中,我想初始化此结构的实例而不显式初始化每个成员变量.也就是说,我想做的事情如下:

counter_t counter;
counter = {10,30,47}; //doesn't work
Run Code Online (Sandbox Code Playgroud)

10:30:47

而不是

counter.hour = 10;
counter.min = 30;
counter.sec = 47;
Run Code Online (Sandbox Code Playgroud)

不记得这个的语法,并没有立即找到一种方法从谷歌搜索.

谢谢!

Ste*_*sop 78

初始化:

counter_t c = {10, 30, 47};
Run Code Online (Sandbox Code Playgroud)

分配:

c = (counter_t){10, 30, 48};
Run Code Online (Sandbox Code Playgroud)

后者被称为"复合文字".

  • @Jeremiah:好的一点,我没注意到C++标签.至于C89,如果人们在他们的意思是"C89"时四处走动说"C",就我而言,他们是独立的;-) (12认同)
  • 请注意,这需要GCC或C99,而不是严格的C89或C++编译器. (7认同)
  • @RBerteig:毫无疑问.我不是说没有人应该使用C89,我说如果他们不能使用C99,那么他们不应该只说他们使用的是"C",没有进一步的警告. (2认同)

Muh*_*tih 18

为了可维护性,我更喜欢列表语法WITH显式标识的变量,如下所示:

counter_t counter = {.hour = 10, .min = 30, .sec = 47};
Run Code Online (Sandbox Code Playgroud)

或者以内联方式返回:

return (struct counter_t){.hour = 10, .min = 30, .sec = 47};
Run Code Online (Sandbox Code Playgroud)

我可以想象一个场景,其中一个更改声明变量的顺序,如果您没有明确标识您的变量,则必须通过所有代码来修复变量的顺序.这样我认为它更清洁,更具可读性

旁注:

正如@AshleyDuncan和@MM所说,在C99 /sf/answers/848558301/之后,此功能已从ISO C++中删除,但在gnu c ++中受支持.

所以虽然你可以做到这一点很好:

g++ -std=gnu++11 main.cpp -o main
Run Code Online (Sandbox Code Playgroud)

如果您尝试上面的示例,这将引发错误:

# need an example. I was unable to find. Even clang++ supports it. If you know 
# one, please suggest an edit
Run Code Online (Sandbox Code Playgroud)

如果需要使用支持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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我也喜欢这个,但如果你想用c ++编译器编译也不是很好,因为c ++不支持C99唯一的功能./sf/ask/848556411/ (2认同)