gpt4 book ai didi

c++ - 在另一个命名空间中使用外部 yyin

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

我正在尝试在我的小项目中使用 flex 和 bison 工具。为了正确理解和使用我正在编写迷你计算器的工具。

问题是我无法在我在另一个命名空间中声明的类的函数中使用变量 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:

#include <string>
#include <iostream>

#ifndef EXAMPLE_H_
#define EXAMPLE_H_

namespace ExNameSpace {
/* global namespace variable */
extern std::ostream *err;
class Example {
public:
bool parse_file (const std::string &file);
};
}
#endif /* EXAMPLE_H_ */

示例.cpp:

#include "Example.h"
namespace ExNameSpace {
std::ostream *err = &std::cout;
Example::Example() {}
Example::~Example() {}
}

解析器.y:

%{
#include <stdio.h>
#include "Example.h"

void yyerror (const char *);
int yylex();

using namespace ExNameSpace;
%}

%%
/* bison rules */
%%

void yyerror(const char *message)
{
extern int yylineno;
*err << "(line " << yylineno << ") " << message << std::endl;
}

bool Example::parse_file(const std::string &file)
{
extern FILE* yyin;
if(!(yyin=fopen(file.c_str(), "r")))
{
*err << "Could not open " << file << std::endl;
return true;
}
int result=yyparse();
fclose(yyin);
return result;
}

扫描仪.l:

%{
#include "parser.hpp"
#include "Example.h"

using namespace ExNameSpace;
%}

%%
/* flex rules */
%%

生成文件:

all: app
app: scanner.l parser.y
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

clean:
rm parser.hpp parser.cpp scanner.cpp

最佳答案

问题是声明

extern FILE* yyin;

在函数 Example::ParseFile 中。由于此声明器没有显式范围,并且包含方法是命名空间 ExNameSpace 的一部分,因此声明隐式位于该命名空间中。但是,由于您从未在任何地方定义 ExNameSpace::yyin,因此您会遇到链接失败的情况。 bison 创建的默认 yyin 在全局命名空间中。所以你需要把这一行改成

extern FILE * ::yyin;

或者干脆完全去掉它,因为 yyin 的文件范围声明此时在文件中应该已经可见,所以不需要局部声明来隐藏文件-范围一。

关于c++ - 在另一个命名空间中使用外部 yyin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14464935/

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