C ++中errno变量的类型是什么?

时间:2017-11-28 15:20:55

标签: c++ errno

我在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作为参数。 我的问题是

  1. 如果是int类型,为什么它不能在上面的代码中起作用?
  2. 如果不是它的类型?

2 个答案:

答案 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放在前面,它也恰好是一个合法的参数声明。

对于宏来说。