C - 结构体和函数的前向声明

6

我试图弄清楚前向声明是如何相互作用的。当前向声明一个接受typedef结构体的函数时,是否有办法让编译器仅将以前前向声明(但实际上未定义)的结构体作为参数接受?

我已经得到了工作代码:

typedef struct{
  int year;
  char make[STR_SIZE];
  char model[STR_SIZE];
  char color[STR_SIZE];
  float engineSize;
}automobileType;

void printCarDeets(automobileType *);

我希望能做到的:

struct automobileType;
void printCarDeets(automobileType *);

//Defining both the struct (with typedef) and the function later

我觉得我可能要么缺少一些非常基础的知识,要么不理解编译器如何处理结构体的前向声明。


2
我知道这是一个老问题,但是没有人提到这是C和C++之间的差异之一。在C中,您可以使用相同的名称具有typedef、结构体、联合和枚举类型,在C++中,由于将标记名称视为typedef的方式与C一样,您只能使用一个。 - technosaurus
1个回答

5

类型定义和结构体名称在不同的命名空间中。因此,struct automobileTypeautomobileType不是同一件事。

您需要给您的匿名结构体一个标记名称才能做到这一点。

在您的 .c 文件中定义:

typedef struct automobileType{
  int year;
  char make[STR_SIZE];
  char model[STR_SIZE];
  char color[STR_SIZE];
  float engineSize;
}automobileType;

您头文件中的声明:

typedef struct automobileType automobileType;
void printCarDeets(automobileType *);

1
C文件应该包括头文件,这种情况下,您可能不想重复typedef,尽管C11如此。头文件很好;您只需在C文件中定义“struct automobileType { ... };”即可。 - Jonathan Leffler
@JonathanLeffler,除了在.h文件中完成它之外,我应该只是按照最初的方式让它工作吗? - Zac Taylor
2
@ZacTaylor 上述答案适用于声明和定义是否在不同文件中。主要问题是您无法前向声明匿名结构体。 - dbush
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jonathan Leffler
@ZacTaylor 两个不同的概念。匿名表示在 struct 关键字后面没有标签名称。空表示字段未指定。 - dbush
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接