首页 > 解决方案 > Flex/Bison - 我如何解决“'symtab' 的多重定义”

问题描述

从“flex & bison”一书中重新创建了高级计算器,并对 c++ 做了一些小的修改。但我无法解决的是编译时出现以下错误。

C:\..\BisonFlexCalculator/Includes/calc.hpp:17: multiple definition of 'symtab'
C:\..\BisonFlexCalculator/Includes/calc.hpp:17: first defined here
C:\..\BisonFlexCalculator/Includes/calc.hpp:17: multiple definition of 'symtab'
C:\..\BisonFlexCalculator/Includes/calc.hpp:17: first defined here
collect2.exe: error: ld returned 1 exit status

我在声明 symtab 的 .hpp 文件中有一个标头保护,但它说它有多个定义。我已将代码上传到github-repo。有人可以帮我理解我做错了什么以及如何解决我的问题吗?

谢谢!

标签: c++bisonflex-lexer

解决方案


问题是您symbol symtab[NHASH]在头文件中定义了变量。每个包含此标头的源文件都将定义该符号。由于您的所有源文件都包含此头文件,因此您将拥有同一对象的多个定义,因此违反了 ODR(一个定义规则),因此会出现错误消息。

我看到symtab仅在calcfunction.cpp中使用,您可以将其移至该文件吗?否则,您可以通过将其标记为 extern 来确保仅在标头中声明它(查看此答案:如何使用 extern 在源文件之间共享变量?)。


推荐阅读