这是一个简单的程序,说明了这个问题.
#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;
}
Run Code Online (Sandbox Code Playgroud)
这是输出.
strerror_r(0):
strerror(0): Success
Run Code Online (Sandbox Code Playgroud)
为什么没有buf?
(使用gcc在Ubuntu上编译.)
如果符合以下条件,则提供符合XSI标准的strerror_r():( _POSIX_C_SOURCE> = 200112L || _XOPEN_SOURCE> = 600)&&!_GNU_SOURCE 否则,提供GNU特定版本.
进一步向下:
GNU特定的strerror_r()返回指向包含错误消息的字符串的指针.这可以是指向函数存储在buf中的字符串的指针,也可以是指向某个(不可变的)静态字符串的指针(在这种情况下,buf未使用).如果函数在buf中存储一个字符串,则最多存储buflen字节(如果buflen太小且errnum未知,则字符串可能被截断).该字符串始终包含终止空字节.
该程序必须使用GNU特定版本而不是填充buf.我重现了发布程序的行为,但存储了返回值,strerror_r()并且它与地址不一样buf.