0

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

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

?

4

1 回答 1

2

如果您只依赖 POSIX,那么不,不能保证您提供的初始化会产生您想要的效果。这是关于该结构类型的定义必须说的程度:

<time.h> 标头应声明 timespec 结构,该结构应至少包括以下成员:

time_t tv_sec 秒。
long tv_nsec 纳秒。

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

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

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

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

于 2020-07-24T18:49:58.913 回答