头文件 typedef 定义

问题描述 投票:0回答:1

嗨,我正在尝试做这样的事情,但我不能解决它。问题是一个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
c struct include header-files
1个回答
1
投票
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语言中,其实只是在符号表中放入一个条目;它就像一个define,但不那么直白,所以这一行。

typedef struct a A;

是为了告诉编译器两件事: 在某个地方有一个带标签的结构。a我想 A 来作为它的简称。 还有一种形式。

struct a;
typedef struct a A;

这里,第一行告诉编译器 "我想让你知道一个叫结构a的东西"; 第二行告诉编译器 "我想让这个结构的别名叫A"。

所以,当编译器在源码中前进时,它知道一个 A 是指 结构a纵使它没有看到这个定义 结构a,它有一个占位符。

但是,如果你在定义了 结构a 来定义另一个结构。

struct b {
       struct a stuff;
       int  morestuff;
};

编译器会抱怨,因为它不知道一个结构的布局 结构a;然而这个。

struct b {
    struct a *stuff;
    int morestuff;
};

是可以的,因为它知道一个指针有多大,并且可以推迟它对一个指针的理解。结构a 直到它需要它。

所以,总结:在尝试使用数据类型之前,先声明或定义数据类型。 C编译器要求这样做。 声明是可以的,除非你需要它的实际布局,在这种情况下,需要定义。

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.