这是一个简单的程序来说明问题。
#include <string.h>
#include <iostream>
int main () {
char buf [30];
strerror_r (0, buf, sizeof (buf));
std :: cout << "strerror_r(0): " << buf << std :: endl;
std :: cout << "strerror(0): " << strerror (0) << std :: endl;
}
这是输出。
strerror_r(0):
strerror(0): Success
为什么buf
中没有任何内容?
(使用gcc在Ubuntu上编译。)
答案 0 :(得分:5)
在以下情况下提供符合XSI标准的strerror_r()版本: (_POSIX_C_SOURCE&gt; = 200112L || _XOPEN_SOURCE&gt; = 600)&amp;&amp; ! _GNU_SOURCE 否则,将提供GNU特定版本。
并进一步向下:
GNU特定的strerror_r()返回指向包含错误消息的字符串的指针。这可以是指向函数存储在buf中的字符串的指针,也可以是指向某个(不可变的)静态字符串的指针(在这种情况下,buf未使用)。如果函数在buf中存储一个字符串,则最多存储buflen字节(如果buflen太小且errnum未知,则字符串可能被截断)。该字符串始终包含一个终止空字节。
程序必须使用特定于GNU的版本,而不是填充buf
。我重现了已发布程序的行为,但存储了strerror_r()
的返回值,它与buf
的地址不同。