如何正确使用strerror_r()在安卓系统中

3

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

Linux man页面将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 */

(from: http://linux.die.net/man/3/strerror_r)
我了解到从以下帖子中,似乎没有适当的方法来取消定义_GNU_SOURCE编译指令,(_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))

针对我们的跨平台项目,我想问是否有更好的方法让我在不触碰代码的情况下进行修复。(也许在安卓中有一些其他的开关可以使strerror_r等函数正常工作。)


不要依赖返回的值? - Some programmer dude
哈哈,那真的很好。上述项目不是我的项目,它依赖于这个返回值。如果不依赖它,仍需要我修改代码。 - Mert
你解决了这个问题或找到了替代方案吗? - Onur Tuna
我已经接触了代码 :) 一段时间后,我们已经移除了包含这段代码的库的依赖。当时我不想触碰代码的原因是因为它是自动生成的(生成器一开始就不是我们自己的)。但是如果你能够接触代码,解决方案就很容易了。 - Mert
我有一个gSOAP服务,并一直在尝试在Android上为其编写客户端。在iOS版本中,使用stdsoap2.cpp一切都正常。然而,在Android上尝试相同的事情失败了。你能简单解释一下"touching"吗? - Onur Tuna
真的没有太多需要解释的。我只是忽略了返回值。 - Mert
1个回答

0
为了可移植性,请假定标准行为(例如XSI)并检查非标准平台(例如GNU)。
#if !defined(__GLIBC__)
// use the XSI standard behavior.
#else
// assume GNU exception
#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接