GCC中的简单错误陷阱

GCC中的简单错误陷阱,c,gcc,C,Gcc,使用GCC,我试图向这个程序添加简单的异常逻辑。理想情况下,一个简单的“如果”就能很好地工作。如果fopen成功,则执行x,如果失败,则执行z。有没有一个简单的方法可以做到这一点 #包括 main() { 文件*ptr; ptr=fopen(“c:\\RedyBoot.bat”、“r”); fclose(ptr); 返回0; } ,所以 ,所以 以下是执行此操作的方法,并报告错误消息: #include <errno.h> #include <stdio.h> #

使用GCC,我试图向这个程序添加简单的异常逻辑。理想情况下,一个简单的“如果”就能很好地工作。如果
fopen
成功,则执行x,如果失败,则执行z。有没有一个简单的方法可以做到这一点


#包括
main()
{
文件*ptr;
ptr=fopen(“c:\\RedyBoot.bat”、“r”);
fclose(ptr);
返回0;
} 

,所以

,所以


以下是执行此操作的方法,并报告错误消息:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{ 
  FILE *handle;
  errno = 0;                     
  handle = fopen("file.txt", "r");
  if (!handle)
  {
    fprintf (stderr, "Cannot open file %s, error: %s",
             "file.txt", strerror (errno));
    exit (-1);
  }
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{ 
文件*句柄;
errno=0;
handle=fopen(“file.txt”,“r”);
如果(!句柄)
{
fprintf(stderr,“无法打开文件%s,错误:%s”,
“file.txt”,strerror(errno));
出口(-1);
}
}

以下是一种执行此操作并报告错误消息的方法:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{ 
  FILE *handle;
  errno = 0;                     
  handle = fopen("file.txt", "r");
  if (!handle)
  {
    fprintf (stderr, "Cannot open file %s, error: %s",
             "file.txt", strerror (errno));
    exit (-1);
  }
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{ 
文件*句柄;
errno=0;
handle=fopen(“file.txt”,“r”);
如果(!句柄)
{
fprintf(stderr,“无法打开文件%s,错误:%s”,
“file.txt”,strerror(errno));
出口(-1);
}
}

您可以使用类似的方法检查条件,如果不满足条件,则打印错误:

#include <stdlib.h>
#include <stdio.h>

#define CHECK(x) \
    do { \
        if (!(x)) { \
            fprintf(stderr, "%s:%d: ", __func__, __LINE__); \
            perror(#x); \
            exit(-1); \
        } \
    } while (0)

int main()
{
    FILE *file = fopen("my_file.txt", "r");
    CHECK(NULL != file);
    fclose(file);
    return 0;
}
#包括
#包括
#定义检查(x)\
做{\
如果(!(x)){\
fprintf(标准,“%s:%d:”,\uuuuu函数,\uuuuu线)\
佩罗尔(#x)\
出口(-1)\
} \
}而(0)
int main()
{
FILE*FILE=fopen(“my_FILE.txt”、“r”);
检查(NULL!=文件);
fclose(文件);
返回0;
}

您可以使用类似的方法检查条件,如果不满足条件,则打印错误:

#include <stdlib.h>
#include <stdio.h>

#define CHECK(x) \
    do { \
        if (!(x)) { \
            fprintf(stderr, "%s:%d: ", __func__, __LINE__); \
            perror(#x); \
            exit(-1); \
        } \
    } while (0)

int main()
{
    FILE *file = fopen("my_file.txt", "r");
    CHECK(NULL != file);
    fclose(file);
    return 0;
}
#包括
#包括
#定义检查(x)\
做{\
如果(!(x)){\
fprintf(标准,“%s:%d:”,\uuuuu函数,\uuuuu线)\
佩罗尔(#x)\
出口(-1)\
} \
}而(0)
int main()
{
FILE*FILE=fopen(“my_FILE.txt”、“r”);
检查(NULL!=文件);
fclose(文件);
返回0;
}

在C语言中,大多数系统函数和标准库函数都有一个特定的错误代码,当它们失败时会返回该代码,然后它们会将全局变量
errno
设置为一个数字,以精确指定出错的原因。每个函数的文档都应该说明错误代码是什么,以及
errno
值是什么。在C语言中,大多数系统和标准库函数都有一个特定的错误代码,当它们失败时会返回该代码,然后它们会将全局变量
errno
设置为一个数字,以精确地指定出错的原因。每个函数的文档都应该说明错误代码是什么,以及
errno
值是什么。但是如果使用:
const char fname[]=“file.txt”会更好
和在两个函数调用中使用fname。这是一种形式的干-不要重复你自己。普通。。代码的目标是快速显示如何处理和显示错误,而不是一本关于C模式的书。但是如果使用:
const char fname[]=“file.txt”,它会更好
和在两个函数调用中使用fname。这是一种形式的干-不要重复你自己。普通。。代码的目标是快速显示如何处理和显示错误,而不是一本关于C模式的书。