C语言extern struct entry数组报错元素类型不完整如何解决
问题根本原因
C语言要求声明数组时,其元素的类型必须是已完成完整定义的类型,不能是仅做了前向声明的不完整类型。
你当前代码的顺序是:
- 先声明
extern struct entry symtable[]; - 后续才给出
struct entry的完整结构定义
编译器处理到extern那一行时,还不知道struct entry的内存布局、占用空间大小,自然无法处理以它为元素的数组声明,因此抛出「array type has incomplete element type 'struct entry'」错误。
修复方案
只需要调整代码顺序,把struct entry的完整定义挪到symtable数组的extern声明之前即可。
额外提醒:你当前头文件中直接定义了input/output/err、tokenval、lineno、lookahead这些全局变量,如果有多个C源文件引用该头文件,会触发重复定义错误,建议也将这些变量的声明改为extern,把实际定义放到单独的.c实现文件中。
修复后的完整头文件代码
#ifndef GLOBAL_H #define GLOBAL_H #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <getopt.h> //list of CONSTANTS #define BSIZE 128 #define NONE -1 #define EOS '\0' #define NUM 256 #define DIV 257 #define MOD 258 #define ID 259 #define DONE 260 // 提前定义struct entry结构 struct entry { char *lexptr; int token; }; //list of prototype function void init(); int lexan(); int lookup(char s[]); int insert(char s[], int tok); void emit(int t,int tval); void parse(); void expr(); void term(); void factor(); void match(int t); void error(char* m); //list of variables (多文件引用场景建议改为extern声明,此处保留原有写法) FILE *input, *output, *err; int tokenval; int lineno; int lookahead; // 此时struct entry已经完整定义,不会再报错 extern struct entry symtable[]; #endif
内容的提问来源于stack exchange,提问作者PRO man
相关产品推荐
相关产品推荐

