旧样式使用sys / select.h宏转换警告

时间:2011-10-20 08:32:45

标签: c++ macros compiler-warnings

我正在开发一个使用select from C ++代码的项目。代码使用宏FD_ZERO, FD_SET, FD_ISSET等。不幸的是,这些宏使用'C'强制转换,当使用-Wold-style-cast编译代码时,它们会生成编译器警告。仅针对这些宏禁用-Wold-style-cast的最佳方法是什么?

我能想到的唯一选择是:

  1. 使用#pragma diagnostic禁用使用宏的功能警告
  2. 将宏调用包装在内联函数中,并禁用函数周围的警告。
  3. 有没有人有更好的方法?

1 个答案:

答案 0 :(得分:0)

我使用-Wall在C ++代码中使用select和那些宏并且没有警告,尽管我不使用-Wold-style-cast。我认为更好的方法是退后一步并重新考虑为什么不使用C风格的演员表很重要。我认为,对于与C标准库函数的接口,它是完全合适的。

C ++ dynamic_cast方法对多态和类很有用。 const_cast是删除常量的特例。 static_cast和C (type)演员非常相似。我不确定使用static_cast<type>提供超过(type)强制转换的优势,除了它是C ++风格。 reinterpret_cast<type>提供的优势远不及C的*(type*)&强制转换方法,而且与它们来的一样丑陋。

一般来说,铸造的需要意味着软件设计存在一定的弱点,尽管dynamic_cast可以说是个例外。虽然努力在一个人自己的代码中不需要强制转换是值得称赞的,但我认为将这些值追溯应用于第三方库(尤其是标准或操作系统库)并不值得。

如果你真的不想在你的代码中使用C风格的强制转换,我会在编译器设置之外设置一个策略,只需查看你的代码并删除它们。如果你真的想让编译器为你做这项工作,那么你必须禁用你无法控制的软件的警告。这可能比它的价值更多,在某些情况下甚至是不必要的。例如,在达尔文,FD_ISSET在其实施中没有演员阵容。毕竟,除了C风格的演员阵容之外,还有更糟糕的做法来消除代码。