errnos在哪里定义?用于i2c的linux c/c ++程序示例

Joh*_*han 2 c c++ linux errno i2c

当一个经典的linux c/c ++软件出现问题时,我们会有一个神奇的变量errno,它可以让我们知道出了什么问题.

但这些错误定义在哪里?

让我们举一个例子(它实际上是来自Qt应用程序的一部分,因此是qDebug()).

if (ioctl(file, I2C_SLAVE, address) < 0) {
    int err = errno;
    qDebug() << __FILE__ << __FUNCTION__ << __LINE__ 
        << "Can't set address:" << address
        << "Errno:" << err << strerror(err);
     ....
Run Code Online (Sandbox Code Playgroud)

下一步是查看该错误是什么,以便我们可以决定是退出还是尝试对此问题采取措施.

所以我们可以在这一点上添加一个if或switch.

if (err == 9)
{
    // do something...
}
else 
{
    //do someting else
}
Run Code Online (Sandbox Code Playgroud)

我的问题是在哪里找到"9"代表的错误?我不喜欢我的代码中那种神奇的数字.

/谢谢

tro*_*foe 13

它们通常在/usr/include/errno.h*中定义,并且可以通过包含errno.h来访问:

#include <errno.h>
Run Code Online (Sandbox Code Playgroud)

我在报告错误时写出了errno值及其文本含义,通过strerror()以下方式获取文本含义:

if (something_went_wrong)
{
    log("Something went wrong: %s (%d)", strerror(errno), errno);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但是,从Linux shell中,您可以使用该perror实用程序找出不同的errno值的含义:

$ perror 9
OS error code   9:  Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

编辑:您的代码应更改为使用符号值:

if (err == EBADF)
{
    // do something...
}
else 
{
    //do someting else
}
Run Code Online (Sandbox Code Playgroud)

编辑2:*在Linux下,至少,实际值是在/usr/include/asm-generic/{errno,errno-base}.h其他地方定义的,如果你想查看它们,找到它们会有点痛苦.