c++ - 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。有人可以帮我理解我做错了什么以及如何解决我的问题吗?
谢谢!
解决方案
问题是您symbol symtab[NHASH]
在头文件中定义了变量。每个包含此标头的源文件都将定义该符号。由于您的所有源文件都包含此头文件,因此您将拥有同一对象的多个定义,因此违反了 ODR(一个定义规则),因此会出现错误消息。
我看到symtab
仅在calcfunction.cpp中使用,您可以将其移至该文件吗?否则,您可以通过将其标记为 extern 来确保仅在标头中声明它(查看此答案:如何使用 extern 在源文件之间共享变量?)。
推荐阅读
- javascript - Log Javascript execution output inside Chrome/Firefox
- heroku - Heroku Container multi-stage build failing to find file
- javascript - logic that works on every browser/device except samsung internet
- javascript - add id to checkbox using loop
- wordpress - XAMPP Wordpress 在 localhost 下创建不同的网站
- c - GtkDrawingArea won't update when drawing happens if Glade is used
- multithreading - 使用信号量同步 N 个进程 - 条件竞争
- c++ - C++/WinApi Memory Usage rising when moving window
- android - java.lang.RuntimeException: Parcelable encountered IOException writing serializable
- azure - Azure IOT Central 复杂规则