5

这是一个说明问题的简单程序。

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

4

1 回答 1

6

来自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.

于 2013-05-05T12:34:30.237 回答