为什么volatile不属于sig_atomic_t

时间:2019-06-15 18:03:15

标签: c++ signals volatile

在我的平台(X86,Fedora,gcc 9.1.1)上,将sig_atomic_t类型定义为普通的int

在C ++标准中,sig_atomic_t总是与volatile限定符一起使用。
我知道为什么需要volatile,但是为什么它不是该类型的一部分呢?

类似的东西:

using sig_atomic_t = volatile int;

2 个答案:

答案 0 :(得分:4)

这是从C继承的。尽管C定义允许sig_atomic_t是volatile限定的,但不需要它。我看过的标准文档(N1570)中使用的所有示例均以volatile sig_atomic_t的形式给出。

这几天,最好使用std:atomic标头when feasible中的<atomic>和其他功能。 (另请参见cppreference上的sig_atomic_t。)

答案 1 :(得分:3)

C89说是

  

可以作为原子访问的对象的整数类型   实体,即使存在异步中断也是如此。

未指定volatile,可能是因为在制定第一个标准时,限定词是新事物。

C99添加了“可能是挥发性修饰词。

我认为从那时起它就向后兼容并结合了“没人关心”,因为信号处理在大多数项目中都只是相对较小的一部分。

大概有人可以在不需要volatile的情况下使用它(例如,存储用于与信号处理程序通信的标志的副本),而在非GNU C中(同样,向后兼容),基本上不可能将一个类型映射到该类型的较低限定版本,这使得选择省略限定符的实现更加灵活。