【问题标题】:Removing C-style casts in C++ code under Android在 Android 下删除 C++ 代码中的 C 样式强制转换
【发布时间】:2011-09-22 15:19:33
【问题描述】:

我在 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 样式转换?

【问题讨论】:

  • C++ 标准包括 C 库(例如<cstring><cstdlib>)。当然应该允许实现包含 C 库头文件,还是您更喜欢完全重写?
  • 好的,已将问题更新为更切中要害。我希望 C++ 库头文件不会导致引入 C 样式转换。
  • @suravi:你对 C 风格的演员有什么不满?它们使用得当,不会妨碍您,并且与 static_cast 相比,它们创建的代码相同,那么为什么不活下去呢?
  • 哇,如果 Visual Studio 中存在该警告,编译输出将会爆炸,因为实现不使用 C 样式转换...
  • @Kerrek SB,当我打开编译器警告以在我自己的代码中捕获 C 转换时,标题 C 样式转换确实妨碍了我。除此之外,我对他们没有任何问题,因为我确信他们是安全的。我会在下面尝试@Peter 的建议。

标签: c++ android c casting android-ndk


【解决方案1】:

是的,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

pushpop 在那里,以便您可以在 #pragmas 之前和之后保持诊断状态。

当然,您需要在包含标准标题的任何地方执行此操作。如果您有很多地方包含它们,那么最好“重构”您的包含,以便您的所有标头都包含一个标头,而该标头又包含带有 diagnostic 包装器的标准标头。

【讨论】:

    【解决方案2】:

    是的,显然 C++ 头文件可能包含 C 头文件。并且该标准不禁止任何标头执行 C 样式转换。不,我没有尝试过该功能。我个人避免在没有编译器帮助的情况下使用 C 样式转换。

    【讨论】:

    • 刚刚编辑了我的问题,说“C++ library 头文件是否应该包含 C 头文件”。
    • @suravi:一些 c++ 标准库头文件,例如 &lt;cstdlib&gt;&lt;ctime&gt; 等确实包含 C 头文件,例如 &lt;stdlib.h&gt;&lt;time.h&gt;,其他的也可能包含如有必要。标准中没有条款禁止这样做
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2012-05-18
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多