如何使用strerror_r所以编译器不会抱怨忽略返回值?

时间:2015-04-06 09:36:02

标签: c++

我有一些库代码可以确保文件不存在。由于它是库代码,我认为值得努力检查其​​他错误代码并报告它们:

struct stat statBuf;
if(::stat(fname.c_str(), &statBuf) == 0){
    LOG(ERROR) << "The file (" << fname << ") already exists. BAD.";
    return ERROR_ALREADY_EXISTS;
    }    

if(errno != ENOENT){
    char errorBuf[512];
    strerror_r(errno, errorBuf, 511);
    LOG(ERROR) << "The file (" << fname << ") does not exist, but stat-ing gave an error (" << errorBuf << ").";
    return ERROR_BAD_FILENAME;
    }

在我们尝试-O3构建而不是调试构建之前,一切都很好,然后获得:

error: ignoring return value of ‘char* strerror_r(int, char*, size_t)’,
declared with attribute warn_unused_result [-Werror=unused-result]

我没有在LOG行中直接使用strerror_r()的原因是为了便携性; the manual page表示可以返回int,或者可以返回char*

我尝试了演员技巧:

(void)strerror_r(errno, errorBuf, 511);

或:

static_cast<void>( strerror_r(errno, errorBuf, 511) );

但仍然只是得到:

error: ignoring return value of ‘char* strerror_r(int, char*, size_t)’, declared with attribute warn_unused_result [-Werror=unused-result]
     (void)strerror_r(errno, errorBuf, 511);

到目前为止,我最好的想法是:

auto dummy = strerror_r(errno, errorBuf, 511);dummy = dummy;

dummy = dummy位用于停止有关未使用变量的投诉。 : - )

(顺便说一句,我甚至不确定linux手册中提到的“XSI”是什么 - 也许它是我永远不需要的那种便携性?)

1 个答案:

答案 0 :(得分:1)

使用-Wno-unused-result选项。

或者,如果您完全确定它不会造成任何伤害,您可以暂时禁用然后重新启用特定警告。 Here's the corresponding GCC documentation