我每天都是一名.NET程序员,我正在使用Robert Seacord的Efficient C来学习C语言. 我在第5章-控制流上,它描述了"goto",我正试图编译" list 5-11:使用goto链来释放资源".但是没有定义类型"Object_t". 我以为我只能在其中一个标准标头(stdint.h等)中找到定义,但我找不到它,Stack Overflow和Google搜索也无济于事. 我搜索了这一章和之前的章节,但都无济于事.这是作者在这一点上没有解释的用户定义类型吗?还是我的谷歌搜索有那么糟糕?

我try 了很多我能想到的头文件:

#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <stddef.h>

下面是函数定义:

int do_something(void) {
  FILE *file1, *file2;
  object_t *obj;
  int ret_val = 0; // Initially assume a successful return value

  file1 = fopen("a_file", "w");
  if (file1 == NULL) {
    ret_val = -1;
    goto FAIL_FILE1;
  }

  file2 = fopen("another_file", "w");
  if (file2 == NULL) {
    ret_val = -1;
    goto FAIL_FILE2;
  }

  obj = malloc(sizeof(object_t));
  if (obj == NULL) {
    ret_val = -1;
    goto FAIL_OBJ;
  }

  // Operate on allocated resources

  // Clean up everything
  free(obj);
FAIL_OBJ:  // Otherwise, close only the resources we opened
  fclose(file2);
FAIL_FILE2:
  fclose(file1);
FAIL_FILE1:
  return ret_val;
}

错误是这样的:error: unknown type name ‘object_t’

推荐答案

没有一种叫做object_t的标准型号.它是用户定义的类型.

考虑到这种类型是如何使用的(例如,只是为了演示内存分配),您可以将其定义为您想要的任何类型.

C++相关问答推荐

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

如何判断宏参数是否为C语言中的整型文字

在struct中调用函数,但struct在void中 *

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

使用NameSurname扫描到两个单独的字符串

测量ARM MCU中断延迟的问题

如果我释放其他内容,返回值就会出错

如何调试LD_PRELOAD库中的构造函数?

C中的指针增量和减量(*--*++p)

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

如何在C++中处理按键

用C++从外部ELF符号读取值

如何使用_newindex数组我总是得到错误的参数

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

C代码在字符串中删除不区分大小写的子字符串的问题

计算SIZE_MAX元素的长数组的大小

Linux/C:带有子进程的进程在添加waitid后都挂起

这些表达式是否涉及 C 中定义的复合文字?

为什么实现文件中的自由函数默认没有内部链接?

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?