我在C++中进行一些系统编程,我想将linux系统中的errno变量传递给我的异常处理程序.您可以在https://pastebin.com/ppgMc8Hj中查看示例代码
#include <sys/stat.h>
#include <cerrno>
#include <iostream>
#include <cstring>
std::string errorString(int errno){
return std::strerror(errno);
}
int main(){
struct stat sb;
errno = 0;
if(stat("/jdfj/", &sb)){
errorString(errno);
}
else{
std::cout << std::boolalpha << S_ISDIR(sb.st_mode) << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
但它会返回这样的错误
In function 'int main()':
14:26: error: invalid conversion from 'int' to 'int* (*)()' [-fpermissive]
6:13: note: initializing argument 1 of 'std::string errorString(int* (*)())'.
Run Code Online (Sandbox Code Playgroud)
我在这里看到http://en.cppreference.com/w/cpp/string/byte/strerror,从errno返回字符串的标准函数接受一个int作为参数.我的问题是
errno是一个实现定义的宏,它扩展为类型的表达式int.
问题是您使用名称errno作为函数参数,这是不允许的.由于名称errno是宏,因此它已经扩展.对我来说,结果是std::string errorString(int (*_errno())).如果更改参数名称,您的代码段可以正常工作.
std::string errorString(int error_num){
return std::strerror(error_num);
}
Run Code Online (Sandbox Code Playgroud)