【问题标题】:How to use strerror_r() properly for android如何为 android 正确使用 strerror_r()
【发布时间】:2015-09-17 11:27:49
【问题描述】:

Android ndk-9c 似乎与strerror_r 声明中的标准相矛盾。

Linux 手册页显示 strerror_r 声明如下:

int strerror_r(int errnum, char *buf, size_t buflen);
        /* XSI-compliant */

char *strerror_r(int errnum, char *buf, size_t buflen);
        /* GNU-specific */

(来自:http://linux.die.net/man/3/strerror_r

从下面的帖子中,我了解到没有正确的方法来取消定义 _GNU_SOURCE pragma,(_GNU_SOURCE 似乎是在内部定义的,即使我设法取消定义它,我也会得到其他类型的错误。)这通常会强制我使用 GNU 特定的版本。

why-is-gnu-source-defined-by-default-and-how-to-turn-it-off

问题是在android-ndk(9c版)中strerror_r的定义如下

extern int    strerror_r(int errnum, char *buf, size_t n);

(来自:android-ndk-r9c\platforms\android-19\arch-arm\usr\include\string.h 行:67)

因此,即使 android ndk 定义了 _GNU_SOURCE,strerror_r 的声明与它相矛盾。因此,在我开始介绍类似

的内容之前
if (defined(_GNU_SOURCE) && !defined(ANDROID))

对于我们的跨平台项目,我想问一下是否有更好的方法可以让我在不接触代码的情况下修复它。(也许 android 中的其他一些开关会使strerror_r 表现良好等)

【问题讨论】:

  • 干脆不依赖返回值?
  • 哈哈,那真的很好。上述项目不是我的项目,它取决于这个返回值。不依赖于它仍然需要我触摸代码。
  • 您是否解决了这个问题或找到了替代方案?
  • 我已经接触过代码:) 一段时间后,我们删除了对包含这段代码的库的依赖。我当时不想接触代码的原因是因为它是自动生成的(而且生成器一开始不是我们的)。但是,如果您可以触摸代码,则解决方案很容易
  • 我有一个 gSOAP 服务,并试图在 Android 上为它编写一个客户端。在 iOS 版本中,stdsoap2.cpp 一切正常。但是,当我在 Android 上尝试相同的操作时,它会失败。你能稍微解释一下“触摸”吗?

标签: android c android-ndk


【解决方案1】:

为了可移植性,假设标准行为(例如 XSI)并检查非标准平台(例如 GNU)

#if !defined(__GLIBC__)
// use the XSI standard behavior.
#else
// assume GNU exception
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多