我正在开发一个使用select from C ++代码的项目。代码使用宏FD_ZERO, FD_SET, FD_ISSET
等。不幸的是,这些宏使用'C'强制转换,当使用-Wold-style-cast
编译代码时,它们会生成编译器警告。仅针对这些宏禁用-Wold-style-cast
的最佳方法是什么?
我能想到的唯一选择是:
#pragma diagnostic
禁用使用宏的功能警告有没有人有更好的方法?
答案 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风格的演员阵容之外,还有更糟糕的做法来消除代码。