在.l文件声明extern struct symbols后,.y文件使用出现警告求助
问题分析与解决方案
问题原因
你遇到的警告本质是:extern struct symbols;属于不完整类型的外部声明,C语言中这种写法无效——编译器无法通过该声明获取结构体的大小、成员等关键信息,因此会忽略extern修饰符并抛出警告。同时,Yacc/Bison的%union要求成员类型是完整定义的类型,仅靠不完整的结构体声明无法满足语法和编译要求。
解决步骤
1. 提取结构体完整定义到公共头文件
创建一个头文件(比如symbols.h),写入struct symbols的完整定义:
#ifndef SYMBOLS_H #define SYMBOLS_H // 替换为你实际的结构体成员 struct symbols { char* symbol_name; int symbol_type; // 其他成员... }; #endif
2. 在.l和.y文件中引入头文件
在你的.l文件中,删除
extern struct symbols;,替换为头文件引入:#include "symbols.h" // 其余lex代码...在你的.y文件中,先引入头文件再定义
%union:#include "symbols.h" %union { struct symbols symp; // 其他union成员... } // 其余yacc/bison代码...
额外说明
如果struct symbols需要作为外部变量使用(而非仅用类型),可以在头文件中补充外部变量声明:
// symbols.h中添加 extern struct symbols global_symbols;
然后在某个.c文件中定义这个变量:
// 比如symbols.c #include "symbols.h" struct symbols global_symbols;
内容的提问来源于stack exchange,提问作者rema
相关产品推荐
相关产品推荐

