strerror_r无效

spr*_*aff 4 c gcc

这是一个简单的程序,说明了这个问题.

#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上编译.)

hmj*_*mjd 5

来自man strerror_r:

如果符合以下条件,则提供符合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.

  • 那个'笨蛋'.如果它具有不同的语义,为什么GNU版本不具有不同的名称呢?荒谬.但是谢谢. (3认同)