【问题标题】:Order of declarations in Posix structs -- is it guaranteed?Posix 结构中的声明顺序——有保证吗?
【发布时间】:2020-11-14 15:55:17
【问题描述】:

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

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

?

【问题讨论】:

  • 不是 答案。但是当您有机会使用 C++20 时,请使用指定的初始化程序。困境解决了。好吧,或者启用它们作为编译器中的扩展。
  • @StoryTeller-UnslanderMonica 是的,我非常想念我的代码中的那些。真的很期待切换到 C++20。

标签: c++ linux posix posix-api


【解决方案1】:

如果您只依赖 POSIX,那么不,不能保证您呈现的初始化会产生您想要的效果。这是what it has to say关于该结构类型定义的程度:

标头应声明 timespec 结构,该结构应 至少包括以下成员:

time_ttv_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 是基于使用这种一般的初始化风格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多