#ifdef HAVE_DECL_STRERROR_R # ifdef HAVE_STRERROR_R_CHAR_P std::string explain_errcode(int errcode) { std::vector<char> buffer(0xff); do { if (strerror_r(errcode, &buffer[0], buffer.size()) != ERANGE) return &buffer[0]; buffer.resize(buffer.size() * 2); } while (true); } # else std::string explain_errcode(int errcode) { std::vector<char> buffer(0xff); do { if (strerror_r(errcode, &buffer[0], buffer.size()) != ERANGE) return &buffer[0]; buffer.resize(buffer.size() * 2); } while (true); } # endif #else
返回类型在autoconf里测试出来是int,但是g++编译时却成了char*。原因在于autoconf里AC_FUNC_STRERROR_R测试时用的gcc,默认不定义_GNU_SOURCE。而g++则默认定义了_GNU_SOURCE宏(据说libstdc++依赖这个宏)