Posix 结构中的声明顺序——是否有保证?

Order of declarations in Posix structs -- is it guaranteed?

...或者换句话说,像这样初始化系统结构是否安全:

struct timespec ts[] = { {0, UTIME_OMIT}, {0, UTIME_OMIT} };
...
int r = utimensat(0, subPath.c_str(), ts, 0);

?

如果你只是依赖POSIX,那么不行,不能保证你给出的初始化一定有你想要的效果。这是what it has to say关于该结构类型定义的范围:

The <time.h> header shall declare the timespec structure, which shall include at least the following members:

time_t tv_sec Seconds.
long tv_nsec Nanoseconds.

它没有指定这两个成员的相对顺序,也没有指定它们是第一个或唯一的成员,因此您的初始化器依赖成员顺序是不安全的。

但是,POSIX指定了C99并通过引用将其合并,因此您可以使用指定的初始化程序来实现您想要的:

struct timespec ts[] = { { .tv_sec = 0, .tv_nsec = UTIME_OMIT},
                         { .tv_sec = 0, .tv_nsec = UTIME_OMIT} };

或者,根据@Storyteller 的评论,如果您想用 C++20 编写该语言,那么 C++20 在该领域赶上了 C。然而,我承认,在我更仔细地查看问题的标签之前,我假设 C 完全基于使用这种一般的初始化风格。