我在SO:Is there a way of disabling the old c style casts in 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样式转换?
答案 0 :(得分:7)
是的,对于包含C头的C ++标准库头,它是完全有效的。
如果您想解决此问题(不修改标准库代码),可以在包含标题之前禁用警告,然后使用GCC Diagnostic Pragmas重新启用它们。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#include <iostream>
#include <vector>
// etc.
#pragma GCC diagnostic pop
push
和pop
就在那里,以便您可以在#pragmas
之前和之后维护诊断的状态。
当然,您需要在包含标准标头的任何地方执行此操作。如果你有很多地方包含它们,那么最好“重构”你的包含,这样你的所有标题都包含一个标题,而标题包含diagnostic
包装的标准标题。
答案 1 :(得分:2)
是的,显然C ++标头可能包含C标头。并且该标准不禁止任何标题执行C风格的演员表。不,我没有尝试过这个功能。我个人在没有编译器的帮助下避免使用C-Style演员表。