旧风格使用sys/select.h宏强制转换警告

Old style cast warnings with sys/select.h macros

本文关键字:转换 警告 select 风格 sys      更新时间:2023-10-16

我正在研究一个使用c++代码select的项目。代码使用了宏FD_ZERO, FD_SET, FD_ISSET等。不幸的是,这些宏使用'C'强制类型转换,因此当使用-Wold-style-cast编译代码时,它们会生成编译器警告。禁用-Wold-style-cast只是为了这些宏的最好方法是什么?

我能想到的唯一选项是:

  1. 使用#pragma diagnostic禁用使用宏的函数的警告
  2. 将宏调用包装在内联函数中,并禁用函数周围的警告。

有人有更好的方法吗?

我在c++代码中使用select和那些带有-Wall的宏,没有得到任何警告,尽管我没有使用- world -style-cast。我认为更好的方法是退后一步,重新考虑为什么不使用c风格的强制转换很重要。我认为,对于C标准库函数的接口,它是完全合适的。

c++ dynamic_cast方法对于多态和类是有用的。const_cast是去除const的特殊情况。static_cast和C的(type)类型转换非常相似。我不确定使用static_cast<type>(type)类型转换有什么优势,除了它是c++风格。与C语言的*(type*)&强制转换方法相比,reinterpret_cast<type>几乎没有什么优势,而且几乎是丑陋的。

一般来说,对类型转换的需求意味着软件设计中的某种弱点,尽管dynamic_cast可以说是一个例外。虽然努力在自己的代码中不需要强制类型转换是值得称赞的,但我认为试图将这些值追溯应用于第三方库,特别是标准库或操作系统库,没有多大价值。

如果你真的不想在你的代码中使用c风格的强制转换,我会在编译器设置之外设置一个策略,只是检查你的代码并删除它们。如果您真的想让编译器为您完成这项工作,那么您必须禁用对您无法控制的软件的警告。这可能是比它的价值更多的工作,在某些情况下甚至是不必要的。例如,在Darwin上,FD_ISSET在其实现中没有强制类型转换。毕竟,还有比c风格的强制转换更糟糕的做法需要从代码中消除。