旧风格使用sys/select.h宏强制转换警告
Old style cast warnings with sys/select.h macros
我正在研究一个使用c++代码select的项目。代码使用了宏FD_ZERO, FD_SET, FD_ISSET
等。不幸的是,这些宏使用'C'强制类型转换,因此当使用-Wold-style-cast
编译代码时,它们会生成编译器警告。禁用-Wold-style-cast
只是为了这些宏的最好方法是什么?
我能想到的唯一选项是:
- 使用
#pragma diagnostic
禁用使用宏的函数的警告 - 将宏调用包装在内联函数中,并禁用函数周围的警告。
有人有更好的方法吗?
我在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风格的强制转换更糟糕的做法需要从代码中消除。
- 将无符号转换为复杂<int>原因符号转换警告
- 为什么在 c++ 中索引字符串会发出隐式转换警告?
- C++:禁用隐式转换警告
- 意外 (IMO) 常量转换警告
- C++:禁用 CMake 中的旧样式转换警告
- 键入从 DWORD 到 64 位指针的强制转换警告
- 隐式转换警告 int 到 int-looklike
- 移植到 64 位时如何避免size_t int 强制转换警告?
- 构造函数中的 C4267 转换警告 - 无法修复过载?
- 如何修复隐式转换警告?
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 在 C++ 中修复类型转换警告的最佳方法
- 为什么仅在列表初始化的情况下才会出现狭窄的转换警告
- -在无符号字符上使用运算符 <<= 时的转换警告
- 如何在gcc或clang中启用从int到int64_t的转换警告
- 如何禁用缩小转换警告
- 使用复合赋值运算符解决转换警告
- gcc 奇怪的转换警告(<B>从"int"转换为"A::count_type {aka short unsigned int}"可能会改变其值)
- 强制缩小转换警告
- 旧风格使用sys/select.h宏强制转换警告