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 完全基于使用这种一般的初始化风格。
...或者换句话说,像这样初始化系统结构是否安全:
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 完全基于使用这种一般的初始化风格。