c – 在Alpine Linux上错误地声明了strerror_r
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – 在Alpine Linux上错误地声明了strerror_r,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1809字,纯文字阅读大概需要3分钟。
内容图文
![c – 在Alpine Linux上错误地声明了strerror_r](/upload/InfoBanner/zyjiaocheng/961/45539701307e489194820152683a6932.jpg)
我在日志助手功能中使用strerror_r.如手册页所述,此功能有两个版本. POSIX版本返回一个int. GNU版本返回一个字符串(char *).
因此,为了使我的C代码更具可移植性,我有一段类似于此的代码:
char buffer[1000];
int size = 1000;
int result = 0;
char* msg = buffer;
buffer[0] = '\0';
#ifdef _GNU_SOURCE
msg = strerror_r(err, buffer, size);
#else
result = strerror_r(err, buffer, size);
if (result != 0)
{
sprintf(buffer, "unknown error: %d", err);
}
#endif
LogToFile(msg);
在上面的代码块中,它将使用任一版本的strerror_r,具体取决于_GNU_SOURCE的存在,它总是由g设置,因为libstdc需要它.在Mac和Unix的其他版本中,它将使用POSIX版本.
现在这个代码已经很长时间以来一直很好用到今天.用户尝试在Alpine Linux上编译我的代码,并使用strerror_r在线上报告此编译器错误
main.cpp:16:21 error: invalid conversion from 'int' to 'char*' [-fpermissive]
哪个映射到此行:
#ifdef _GNU_SOURCE
msg = strerror_r(err, buffer, size);
在此平台上的/usr/include/string.h中达到峰值会显示以下内容:
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
...
int strerror_r (int, char *, size_t);
...
#endif
看来无论使用什么编译器环境,唯一声明的strerror_r版本是返回int的POSIX版本.这就解释了错误发生的原因.
无需告诉用户他们可以手动#undef _GNU_SOURCE或修改源代码,我如何解决这个问题,使代码可以继续移植?全局取消定义的_GNU_SOURCE很可能是非首发的,因为这是C(并且如上所述,libstdc要求).我试图看看是否会有另一个我可以测试的宏组合,但我无法想出任何明显的东西.
解决方法:
您可以利用C函数重载:
char* check_error(int result, char* buffer, int err) {
if(result)
sprintf(buffer, "unknown error: %d", err);
return buffer;
}
char* check_error(char* result, char*, int) {
return result;
}
并且在使用中摆脱条件编译:
char buffer[1000];
buffer[0] = '\0';
char* msg = check_error(strerror_r(err, buffer, sizeof buffer), buffer, err);
LogToFile(msg);
内容总结
以上是互联网集市为您收集整理的c – 在Alpine Linux上错误地声明了strerror_r全部内容,希望文章能够帮你解决c – 在Alpine Linux上错误地声明了strerror_r所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。