gpt4 book ai didi

C 未知类型名称堆栈

转载 作者:太空宇宙 更新时间:2023-11-04 03:17:48 25 4
gpt4 key购买 nike

我想将堆栈实现为链表,但每次我尝试编译 main 时,它都说错误在 "main.h"at "stack* head"...

error: unknown type name ‘stack’
unsigned long int inst_len, cell *d_tape, unsigned int dt_index, stack *head);

这是我的“main.h”头文件:

#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

#define SUCCESS 0
#define FAIL -1
#define CELLMAX 255
#define CELLMIN 0
#define ARRJMP 10
#define DTMAXLEN 30000

typedef unsigned char cell;

int loop(cell *ins_tape, unsigned long int *inst_index,
unsigned long int inst_len, cell *d_tape,
unsigned int dt_index, stack *head);

它说错误在函数循环“stack *head”的最后一个参数中

这是文件“stack.h”:

#ifndef STACK_H
#define STACK_H

#include "main.h"

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);

#endif

我在 loop() 函数中使用了这些函数,它没有向我显示 stack.h 中的任何错误,但我认为这可能是因为它在loop() 首先声明。

感谢您的帮助,如果这已经在某处得到解答,我们深表歉意。我已经看过几个问题,但它们有不同的问题。

最佳答案

只要文件包含 stack.h,#ifndef/#endif block 就会禁止将 stack.h 中的所有内容放在 main.h 的内容之前。

为了全面解释这个问题,我将逐步完成相关的预处理器步骤。下面将对可能的解决方案进行总结,但如果您有任何疑问,请务必通读整篇文章。

考虑下面的测试文件。

测试.c:

#include "stack.h"

int DoFoo(void)
{
return;
}

预处理器用 stack.h 的内容替换#include "stack.h"。

test.c扩展1:

#ifndef STACK_H
#define STACK_H

#include "main.h"

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);

#endif

int DoFoo(void)
{
return;
}

接下来预处理器重新计算#ifndef STACK_H,它被评估为真,所以#ifndef 和#endif 中的内容被保留。

test.c扩展2:

#define STACK_H

#include "main.h"

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);


int DoFoo(void)
{
return;
}

我暂时忽略 #define STACK_H。下一个主要步骤是用 main.h 的内容替换 #include "main.h"

test.c扩展3:

#define STACK_H

#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

#define SUCCESS 0
#define FAIL -1
#define CELLMAX 255
#define CELLMIN 0
#define ARRJMP 10
#define DTMAXLEN 30000

typedef unsigned char cell;

int loop(cell *ins_tape, unsigned long int *inst_index,
unsigned long int inst_len, cell *d_tape,
unsigned int dt_index, stack *head);

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);


int DoFoo(void)
{
return;
}

接下来我将用 stack.h 的内容替换 #include "stack.h",就像我们之前所做的那样。

test.c扩展4:

#define STACK_H

#include <stdlib.h>
#include <stdio.h>
#ifndef STACK_H
#define STACK_H

#include "main.h"

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);

#endif

#define SUCCESS 0
#define FAIL -1
#define CELLMAX 255
#define CELLMIN 0
#define ARRJMP 10
#define DTMAXLEN 30000

typedef unsigned char cell;

int loop(cell *ins_tape, unsigned long int *inst_index,
unsigned long int inst_len, cell *d_tape,
unsigned int dt_index, stack *head);

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);


int DoFoo(void)
{
return;
}

请注意,在#ifndef STACK_H 之前有一个#define STACK_H,因此我们可以删除#ifndef/#endif block 中的所有内容。

test.c扩展5:

#define STACK_H

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

#define SUCCESS 0
#define FAIL -1
#define CELLMAX 255
#define CELLMIN 0
#define ARRJMP 10
#define DTMAXLEN 30000

typedef unsigned char cell;

int loop(cell *ins_tape, unsigned long int *inst_index,
unsigned long int inst_len, cell *d_tape,
unsigned int dt_index, stack *head);

typedef struct Stack{
unsigned long int begin_index;
unsigned long int end_index;
struct Stack *prev;
} stack;

int initStack(stack *head);
int pushStack(stack *head, unsigned long int b_i, unsigned long int e_i);
int popStack(stack *head);


int DoFoo(void)
{
return;
}

总结:

在上面的文件中,问题应该很清楚了。 loop() 的声明在定义之前使用类型堆栈。

解决方案:

1) 在包含 stack.h 之前总是包含 main.h(这是一个非常糟糕的解决方案)

2) 有两个头文件是没有意义的,当您包含其中任何一个时,结果总是包含两个头文件。考虑合并这些头文件。

3) 将两个头文件中需要的内容拆分成自己的头文件。 main.h 和 stack.h 都将包含这个新的头文件,而不是彼此。

4) 将stack.h需要的内容全部移动到stack.h中,并从stack.h中删除#include "main.h"

关于C 未知类型名称堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49722674/

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