【问题标题】:Instance of object in flex-bison c++flex-bison c ++中的对象实例
【发布时间】:2020-08-30 09:05:36
【问题描述】:

我的 main.hpp 看起来像这样:

#include "json.tab.h"
#include "ob.hpp"

extern Ob *ob;

在我的 test.l 中,我写道:

%{
    #include "main.hpp"
%}


%token  KEY
%token  COMMA

%%
KEY_SET         : KEY                                                 {ob->someOp();}
                | KEY_SET COMMA KEY                                   {ob->someOp();}
%%

但这给了我:

C:\......c:(.text+0x37a): undefined reference to `ob'
C:\......c:(.text+0x38e): undefined reference to `Ob::someop()'

那么我怎样才能从解析器中的任何位置调用那个 Ob 对象呢?

我的 Ob 类(Ob.hpp):

#include <bits/stdc++.h>
using namespace std;

#ifndef O_H_
#define O_H_

using namespace std;

class Ob {
public:
    Ob();
    ~Ob();
    someop();
};

#endif /*O_H_*/

还有Ob.cpp

Ob::someop()
{
    cout << "c++ is lit" << endl;
}

现在我已经将 Ob 中的所有方法都设置为静态,这样就不需要实例了。我的构建规则看起来像这样:

g++ lex.yy.c test.tab.c main.cpp *.hpp -o test.exe

我把解析器生成器简单化了,没有任何方法调用,它工作正常,没有错误,没有警告:

%%
KEY_SET         : KEY     
                | KEY_SET COMMA KEY    
%%

当我添加{Ob::someOp();} 时,它又给了我同样的错误。

我所有的代码都在这里:https://gist.github.com/maifeeulasad/6d0ea58cd70fbe255a4834eb46f2e1fd

【问题讨论】:

  • 错误消息说你没有定义obOb::someop()。您还没有显示任何定义这些内容的代码。因此,目前您收到这些错误对我来说并不奇怪。您是否声称您已经定义了obOb::someop()?如果是这样,那么您应该显示该代码。由于这些是链接器错误,因此有关如何构建程序的一些详细信息也会有所帮助。
  • @john 我已经添加了我认为需要的所有代码,你能再检查一次吗?
  • 好吧,如果这就是所有代码,那么ob 仍然没有定义,而Ob::someop() 是语法错误(缺少返回类型,大概应该是void Ob::someop())。所以我只能假设你实际上并没有编译 Ob.cpp,否则你会看到编译器错误消息。
  • @john ,main.hpp 的第三个 sloc 有一个 Ob 的引用,带有 extern 关键字。而test.l 正在导入或包含main.hpp.. test.l 不应该引用 Ob 吗?而且我也尝试过使用 void 关键字。最终构建规则有g++ lex.yy.c test.tab.c main.cpp -o test.exe,其中包含main.cpp。它包含main.hpp..
  • 另外:(1)这个问题与flex或bison无关。这只是使问题感到困惑(也可能使您感到困惑)。首先弄清楚如何编写一个分布在多个文件中的 C++ 程序。然后,您可以将 flex 和 bison 添加到组合中。 (2) 除非您知道自己要什么,否则永远不要让 GCC 编译头文件 (*.hpp)。 (你要的是一个预编译的头文件。如果你不知道那是什么,你不想要求构建一个。)(3)Ob.cpp 无法编译:&lt;stdin&gt;:13:12: error: ISO C++ forbids declaration of ‘someop’ with no type [-fpermissive]。请解决这个问题

标签: c++ compiler-construction linker-errors bison flex-lexer


【解决方案1】:

您应该将所有.cpp 文件传递​​给编译命令,而不是.hpp.hpp 将自动包含在预处理器中。如果你不这样做(你的命令中没有包含Ob.cpp),那么它就找不到其中包含的函数的定义。

所以你的编译命令应该是这样的:

g++ lex.yy.c test.tab.c main.cpp Ob.cpp -o test.exe

【讨论】:

  • 很抱歉,但这不起作用......仍然未定义......我已经更新了问题,你能再检查一次吗??
  • 问题中没有任何内容表明这是问题所在。
  • 查看编译命令并查看它给出的错误。这确实表明未定义的引用是由缺少源文件引起的。
  • 我不认为这是由于构建,因为我也尝试过 g++ lex.yy.c test.tab.c main.cpp *.hpp -o test.exe...我认为问题出在 - 前向声明 i>, - 缺乏编写 C++ 代码的知识,因为我不知道如何构建这些代码,也许我在某处导入了一些额外的东西,或者我导入的更少..我已经更新了问题并在 gist 中添加了我的工作目录,请查看...gist.github.com/maifeeulasad/…
  • 再次阅读我的答案并尝试我的命令并告诉我结果。
【解决方案2】:

解析器生成器如下所示:

%{
    #include<stdio.h>
    #include "main.h"
    #include "json.h"
    using namespace Maifee;
%}
...
meaw           : INTEGER               {Json::ok();}

标题:

#ifndef JSON_H
#define JSON_H

#include <bits/stdc++.h>
using namespace std;

namespace Maifee{

class Json {
public:
    static void ok();
};
#endif // JSON_H

cpp 文件:

#include <bits/stdc++.h>
#include "json.h"

using namespace std;
using namespace Maifee;

void Json::ok()
{
    //whatever here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多