[英]Header file typedef definition
嗨,我正在尝试制作这样的东西,但我无法解决。 问题是一个 typedef 需要另一个。 我真的很感谢别人的帮助!
#ifndef SHELL_DATA_H
#define SHELL_DATA_H
#include <buffer.h>
#define COMMANDS 10
#define MAX_ARGS 4
typedef struct {
void (*command)(int, char **, t_shellData *shelldData);
char *name;
char *description;
} t_command;
typedef struct {
t_command commands[COMMANDS];
t_buffer buffer;
char username[BUFFER_SIZE];
} t_shellData;
#endif
typedef struct command t_command;
typedef struct shelldata t_shellData;
struct command {
void (*command)(int, char **, t_shellData *shelldData);
char *name;
char *description;
};
struct shelldata {
t_command commands[COMMANDS];
t_buffer buffer;
char username[BUFFER_SIZE];
};
应该为你解决它。 结构标签和typedef名称可以相同; 为了清楚起见,我只是将它们重命名。
C 是一种简单的语言,其基本原理是不要让人们感到惊讶。 为此,C 中的实体需要在使用前声明或定义。 举个简单的例子:
int f() {
int a = 7;
int b = a;
....
}
可以,但这不是:
int f() {
int b = a;
int a = 7;
....
}
虽然不完全是,但像 golang 这样的语言允许这样做——编译器将围绕并找到你显然想要的定义。
typedef,在C中,其实只是在符号表中放了一个入口; 它就像一个定义,但不那么直截了当,所以这行:
typedef struct a A;
用于通知编译器两件事:某处有一个带有标签a的结构,我希望A成为它的缩写。 还有另一种形式:
struct a;
typedef struct a A;
在这里,第一行告诉编译器“我想让你知道一个叫做 struct a 的东西”; 第二行“我想要该结构的别名,称为 A”。
因此,随着编译器通过源代码进行,它知道A表示struct a ,即使它没有看到struct a的定义,它也有一个占位符。
但是,如果您尝试过,在定义struct a之前定义另一个结构:
struct b {
struct a stuff;
int morestuff;
};
编译器会抱怨,因为它不知道struct a的布局; 但是这个:
struct b {
struct a *stuff;
int morestuff;
};
没关系,因为它知道指针有多大,并且可以推迟对结构 a的理解,直到它需要它。
因此,总结:在尝试使用数据类型之前声明或定义数据类型。 C 编译器需要它。 声明是可以的,除非您需要它的实际布局,在这种情况下需要定义。
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.