C++ 在另一个命名空间中使用外部yyin
我试图在我的小项目中使用flex和bison工具。 为了正确理解和使用这些工具,我正在编写迷你计算器 问题是我无法在我在另一个命名空间中声明的类的函数中使用变量C++ 在另一个命名空间中使用外部yyin,c++,linker,bison,extern,flex-lexer,C++,Linker,Bison,Extern,Flex Lexer,我试图在我的小项目中使用flex和bison工具。 为了正确理解和使用这些工具,我正在编写迷你计算器 问题是我无法在我在另一个命名空间中声明的类的函数中使用变量yyin main()函数应该读取运行参数,并在命名空间ExNameSpace中使用Example::parse_file() 链接我得到的编译文件时: make all bison --defines=parser.hpp --output=parser.cpp parser.y flex --outfile=scanner.cpp s
yyin
main()
函数应该读取运行参数,并在命名空间ExNameSpace
中使用Example::parse_file()
链接我得到的编译文件时:
make all
bison --defines=parser.hpp --output=parser.cpp parser.y
flex --outfile=scanner.cpp scanner.l
g++ -o program scanner.cpp parser.cpp Example.cpp -lfl
/tmp/ccyQN7z9.o: In function `ExNameSpace::Example::parse_file(std::string const&)':
parser.cpp:(.text+0xabc): undefined reference to `ExNameSpace::yyin'
parser.cpp:(.text+0xac3): undefined reference to `ExNameSpace::yyin'
parser.cpp:(.text+0xb3e): undefined reference to `ExNameSpace::yyin'
collect2: error: ld returned 1 exit status
make: *** [app] Error 1
我的建议是,变量yyin
由flex在外部定义,但没有正确地移植到ExNameSpace
名称空间
附加我使用的源文件
示例。h:
#包括
#包括
#ifndef示例_
#定义示例_
命名空间ExNameSpace{
/*全局命名空间变量*/
外部标准::ostream*err;
课例{
公众:
bool parse_文件(const std::string和file);
};
}
#endif/*示例*/
示例。cpp:
#包括“Example.h”
命名空间ExNameSpace{
std::ostream*err=&std::cout;
示例::示例(){}
示例::~Example(){}
}
parser.y:
%{
#包括
#包括“Example.h”
无效错误(常量字符*);
int-yylex();
使用名称空间ExNameSpace;
%}
%%
/*野牛规则*/
%%
无效错误(常量字符*消息)
{
外部内部yylineno;
*错误问题在于声明
extern FILE* yyin;
在函数Example::ParseFile
中。由于此声明符没有显式作用域,且包含的方法是命名空间ExNameSpace
的一部分,因此该声明隐式位于该命名空间中。但由于您从未在任何地方定义ExNameSpace::yyin
,因此会出现链接失败。默认的yyin
是在y bison位于全局命名空间中。因此需要将此行更改为
extern FILE * ::yyin;
或者干脆把它全部去掉,因为yyin
的文件范围声明此时应该已经在文件中可见,所以不需要本地声明来隐藏文件范围声明。问题在于声明
extern FILE* yyin;
在函数Example::ParseFile
中。由于此声明符没有显式作用域,且包含的方法是命名空间ExNameSpace
的一部分,因此该声明隐式位于该命名空间中。但由于您从未在任何地方定义ExNameSpace::yyin
,因此会出现链接失败。默认的yyin
是在y bison位于全局命名空间中。因此需要将此行更改为
extern FILE * ::yyin;
或者干脆把它全部去掉,因为yyin
的文件范围声明此时应该已经在文件中可见,所以不需要本地声明来隐藏文件范围声明。可以尝试extern“C”FILE*yyin;
…现在我得到了:parser.y:在成员函数'bool ExNameSpace::Example::parse_FILE(const string&)中“:解析器。y:62:10:错误:字符串常量解析器之前应为非限定id。y:63:8:错误:“yyin”未在此作用域解析器中声明。y:72:10:错误:“yyin”未在此作用域中声明
请查看“信息性弹出窗口”在标记问题之前,请先在标记上单击。我删除了Flex标记,因为这与Adobe/Apache UI框架无关,并添加了gnu Flex标记,它用于词法分析器。也许可以尝试extern“C”FILE*yyin;
…现在我得到了:parser.y:在成员函数'bool ExNameSpace::Example::parse_FILE(const string&)“:解析器。y:62:10:错误:字符串常量解析器之前应为非限定id。y:63:8:错误:“yyin”未在此作用域解析器中声明。y:72:10:错误:“yyin”未在此作用域中声明
请查看“信息性弹出窗口”我删除了Flex标记,因为这与Adobe/ApacheUI框架无关,并添加了GNUflex标记,用于词法分析器。