gpt4 book ai didi

c - C 和 .h 文件中的结构

转载 作者:行者123 更新时间:2023-11-30 15:27:37 26 4
gpt4 key购买 nike

我对 c 中的结构感到困惑。我正在尝试创建一个 .h 文件,其中包含我将使用的所有结构。我创建了 structs.h

#include <ucontext.h>

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



struct TCB_t;

typedef struct
{
struct TCB_t * next;
struct TCB_t * previous;
ucontext_t context;
int val;
}TCB_t;

我的 TCB.h 文件

#include "structs.h"



int count =0;
struct TCB_t *RunQ = NULL;
struct TCB_t *ptr = NULL;

void init_TCB (struct TCB_t *tcb, void *function, void *stackP, int stack_size, int *arg)
{
memset(tcb, '\0', sizeof(struct TCB_t));
getcontext(&tcb->context);
tcb->context.uc_stack.ss_sp = stackP;
tcb->context.uc_stack.ss_size = (size_t)stack_size;
makecontext(&tcb->context, function, 1, arg);

}

当我运行时,出现以下错误。

Description Resource    Path    Location    Type
Field 'ss_size' could not be resolved TCB.h /projThree/src line 14 Semantic Error


Description Resource Path Location Type
Field 'ss_sp' could not be resolved TCB.h /projThree/src line 13 Semantic Error


Description Resource Path Location Type
Field 'uc_stack' could not be resolved TCB.h /projThree/src line 13 Semantic Error


Description Resource Path Location Type
Field 'uc_stack' could not be resolved TCB.h /projThree/src line 14 Semantic Error


Description Resource Path Location Type
Symbol 'NULL' could not be resolved TCB.h /projThree/src line 6 Semantic Error


Description Resource Path Location Type
Symbol 'NULL' could not be resolved TCB.h /projThree/src line 7 Semantic Error

如果我将结构从 structs.h 移至 TCB.h,错误就会消失。为什么会这样,TCB.h 不应该访问 structs.h 中的结构,因为我在页面顶部包含了“structs.h”?

最佳答案

问题在于您已经在某处声明了一个 struct TCB_t,并且您已经定义了一个名为 TCB_ttypedef > 对于无标记(匿名)struct 类型,但您尚未定义类型 struct TCB_t

struct TCB_t;    // There is, somewhere, a type struct TCB_t

typedef struct // This is an anonymous struct, not a struct TCB_t
{
struct TCB_t * next;
struct TCB_t * previous;
ucontext_t context;
int val;
} TCB_t; // This is a typedef for the anonymous struct

您需要这样写:

typedef struct TCB_t TCB_t;

struct TCB_t
{
TCB_t *next; // Optionally struct TCB_t
TCB_t *previous; // Optionally struct TCB_t
ucontext_t context;
int val;
};

或者这个:

typedef struct TCB_t
{
struct TCB_t *next;
struct TCB_t *previous;
ucontext_t context;
int val;
} TCB_t;

两者最终都以struct TCB_t和一个普通类型TCB_t结束,它是struct TCB_t的别名。

请注意,_t 后缀是正式保留供实现(编译器和支持库)使用的。您自己使用它时可能会遇到问题(但可能不会,直到更改名称已经太晚了)。

编译错误的原因是编译器没有被告知struct TCB_t包含什么,所以你无法访问它的context成员,因此不是 context 成员中的字段。

关于c - C 和 .h 文件中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26923403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com