我在C ++中进行一些系统编程,我想将linux系统中的errno变量传递给我的异常处理程序。您可以在此处查看示例代码 https://pastebin.com/ppgMc8Hj
value col2 id
1 1 min 1
2 2 min 2
3 3 max 1
4 2 avg 1 ## row I'd like to add. where "avg" identifies average of min and max
但它会返回一个像这样的错误
#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;
}
}
我在这里看到http://en.cppreference.com/w/cpp/string/byte/strerror,从errno返回字符串的标准函数接受一个int作为参数。 我的问题是
答案 0 :(得分:7)
errno
是一个实现定义的宏,它扩展为int
类型的表达式。
问题是您使用名称errno
作为函数参数,这是不允许的。由于名称errno
是一个宏,因此它已经扩展。对我来说,它会产生std::string errorString(int (*_errno()))
。如果更改参数名称,您的代码段就可以正常工作。
std::string errorString(int error_num){
return std::strerror(error_num);
}
答案 1 :(得分:0)
除了François的回答之外,让我们看一下使用GCC的Linux系统上的预处理器输出。 g++ -E test.cpp
给出:
# 6 "test.cpp"
std::string errorString(int
# 6 "test.cpp" 3 4
(*__errno_location ())
# 6 "test.cpp"
){
return std::strerror(
# 7 "test.cpp" 3 4
(*__errno_location ())
# 7 "test.cpp"
);
}
因此errno
在此定义为(*__errno_location ())
。它实际上是一个函数调用,但如果你把int
放在前面,它也恰好是一个合法的参数声明。
对于宏来说。