删除Android下C++代码中的C样式强制转换
Removing C-style casts in C++ code under Android
我在SO上看到了这篇文章:有没有一种方法可以禁用c++中的旧c样式转换,我很高兴能将-Wold-style-cast
应用到我的Android c++代码中。我很快在stdio.h
中遇到了以下类型:
static __inline int __sputc(int _c, FILE *_p) {
if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != 'n'))
return (*_p->_p++ = _c);
else
return (__swbuf(_c, _p));
}
文件stdio.h
是通过从ostream
开始的一系列其他包含而包含的。C++库头是否应该包括进行C样式强制转换的C头?有人尝试过在Android NDK下禁用C风格的强制转换吗?
是的,C++标准库头包含C头是完全有效的。
如果你想绕过这个问题(不修改标准库代码),你可以在包括标题之前禁用警告,然后使用GCC诊断程序重新启用它们。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#include <iostream>
#include <vector>
// etc.
#pragma GCC diagnostic pop
push
和pop
在那里,以便您可以在#pragmas
之前和之后保持诊断状态。
当然,在包含标准头的任何地方都需要这样做。如果你有很多地方包含它们,那么最好"重构"你的include,让所有的header都包含一个单独的header,而这个header又包含了带有diagnostic
包装的标准header。
是的,显然C++标头可能包含C标头。该标准并没有禁止任何标头执行C样式的强制转换。不,我还没有试过这个功能。就我个人而言,我避免在没有编译器帮助的情况下使用C风格的强制转换。
相关文章:
- 如何修复函数样式强制转换或类型构造的预期"("?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- C 样式转换引用
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- C++:禁用 CMake 中的旧样式转换警告
- 替换 c++ 中的 c 样式强制转换 (long&)
- Windows VC++编译器允许一种奇怪的c样式转换方式(或者它可能不是转换??)
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- 为什么使用运算符 class_name() 和 c 样式转换时 g++ 上出现错误
- 如何在 vim 中将 C 样式转换转换为C++样式转换
- C 样式转换是添加程序集(代码)还是仅供编译器了解情况
- 为什么C样式转换的行为与dynamic_cast不同
- 我可以使用C样式转换将派生类转换为私有基类吗
- 确定编译器为给定的C样式转换生成的内容
- 转换为枚举类型需要显式转换(static_cast、C样式转换或函数样式转换)
- 使用C++样式转换以所需的精度执行表达式的正确方法是什么
- 错误 C2274:使用 auto 进行 boost::p osix_time::time_duration 时出现"函数样式转换"的原因是什么?
- 函数调用参数中的构造函数样式转换
- 有没有办法在 c++ 中禁用旧的 c 样式转换