链接C++;Borland C+中的C代码+;3.1编译器

链接C++;Borland C+中的C代码+;3.1编译器,c,linker-errors,borland-c++,C,Linker Errors,Borland C++,我的FYP的一部分是为一个非常古老的游戏(Wolfenstein-3D)编写代码。它需要使用Borland C++ V3.1编译器。这是我目前拥有的代码,但它在Borland编译器中给出了一个错误。有什么想法吗 编译器中的错误: 神经元 #ifdef __cplusplus // only actually define the class if this is C++ class Neuron { public: void foo(); int bar

我的FYP的一部分是为一个非常古老的游戏(Wolfenstein-3D)编写代码。它需要使用Borland C++ V3.1编译器。这是我目前拥有的代码,但它在Borland编译器中给出了一个错误。有什么想法吗

编译器中的错误:

神经元

#ifdef __cplusplus // only actually define the class if this is C++
class Neuron {
    public:
        void foo();
        int bar(int x, int y);
    };

#else   // C doesn't know about classes, just say it's a struct
    typedef struct Neuron Neuron;

#endif

// access functions
#ifdef __cplusplus
    #define EXPORT_C extern "C"
#else
    #define EXPORT_C
#endif

EXPORT_C Neuron* NeuronNew(void);
EXPORT_C void NeuronDelete(Neuron* n);
EXPORT_C void NeuronFoo(Neuron* n);
EXPORT_C int NeuronBar(Neuron* n, int x, int y);
神经元

#include "NEURON.h"

void Neuron::foo() {
}

int Neuron::bar(int x, int y) {
    return x+y;
}

EXPORT_C Neuron* NeuronNew(void) {
    return new Neuron();
}

EXPORT_C void NeuronDelete(Neuron* n) {
    delete n;
}

EXPORT_C void NeuronFoo(Neuron* n) {
    return n->foo();
}

EXPORT_C int NeuronBar(Neuron* n, int x, int y) {
    return n->bar(x, y);
}
C源文件中的用法

#include "NEURON.h"
...

void GameLoop (void)
{
    ...
    Neuron* m = NeuronNew();

    NeuronFoo(m);
    NeuronDelete(m);

    ...
}

我的假设是,即使编译器是C++编译器,C++代码中也有一些新的东西,编译器不能处理

< p>错误消息看起来非常像其他编译器无法为你的类构建.cpp文件时所得到的消息。它不是在抱怨
NeuronNew
,而是在抱怨
\u Neuron\u new
(注意小写的“n”和额外的下划线),所以Borland很可能就是这样命名构造函数/析构函数的

它成功编译了.cpp和as C++吗?编译器中的文件后缀映射是否已连接?您是否已将无效代码添加到

#ifdef_uucplusplus
行中,以验证是否曾经定义过,而不是始终定义过(0或1)?您是否对Makefile/project中的所有include、文件名和都使用相同的大小写,以便找到它们

哦,你试过做:

typedef struct Neuron* NeuronPtr;

然后在C包装中使用
NeuronPtr
而不是
Neuron*
?C++编译器不应该关心(只要你在代码< >代码中引用了<代码> TyPulf类神经元NoNoPTR;,但这意味着它可能不再尝试在任何C代码中解析前向声明的结构。

当其他编译器无法为您的类构建.cpp文件时,错误消息看起来非常类似。它不是在抱怨
NeuronNew
,而是在抱怨
\u Neuron\u new
(注意小写的“n”和额外的下划线),所以Borland很可能就是这样命名构造函数/析构函数的

它成功编译了.cpp和as C++吗?编译器中的文件后缀映射是否已连接?您是否已将无效代码添加到

#ifdef_uucplusplus
行中,以验证是否曾经定义过,而不是始终定义过(0或1)?您是否对Makefile/project中的所有include、文件名和都使用相同的大小写,以便找到它们

哦,你试过做:

typedef struct Neuron* NeuronPtr;

然后在C包装中使用
NeuronPtr
而不是
Neuron*
?C++编译器不应该关心(只要你在C++代码中引用了<代码> TyPulf类NoMyNoNoPTR;),它就意味着它可能不再试图在任何C代码中解析正向声明的结构。< /P>根本就不编译任何C++代码。所以它是一个C++编译器并不重要。您只提供了一个typedef,结构必须在某个地方定义。我们看不到,编译器也看不到。有趣的是,为了让编译器至少不产生错误,您建议如何定义结构。我已经有一段时间没有写C了,也没有尝试修改typedef struct Neuron{int ans;}Neuron;我什么也没做。有趣的是,CLion中的代码编译和运行都很好,这就是为什么我认为根本的问题是Borland。确保在C文件中使用
NeuronNew
而不是
\uNeuronNew
。不确定
\uCPlusplus
是否在旧的TC++中定义了令牌为什么还要用C?当你知道你有C++的时候。如果需要在C中编译源代码,那么不要使用C++,否则你需要对所有的代码进行两次编码…或者添加大量的定义,使代码不可读。另外,您是如何导入导出函数的,这可能是一个混乱的问题,因为您很可能正在链接。同样
*.C
意味着
C
code而不是
C++
@HansPassant,至少在当前版本的GCC和Clang中(至少可以追溯到十年前),您可以转发declare struct指针,而无需在头文件中声明它们。实际定义只需要在实际创建结构的“实例”(即变量、访问字段或将其大小转换为MalC/Cit)时,而不是编译任何C++代码。所以它是一个C++编译器并不重要。您只提供了一个typedef,结构必须在某个地方定义。我们看不到,编译器也看不到。有趣的是,为了让编译器至少不产生错误,您建议如何定义结构。我已经有一段时间没有写C了,也没有尝试修改typedef struct Neuron{int ans;}Neuron;我什么也没做。有趣的是,CLion中的代码编译和运行都很好,这就是为什么我认为根本的问题是Borland。确保在C文件中使用
NeuronNew
而不是
\uNeuronNew
。不确定
\uCPlusplus
是否在旧的TC++中定义了令牌为什么还要用C?当你知道你有C++的时候。如果需要在C中编译源代码,那么不要使用C++,否则你需要对所有的代码进行两次编码…或者添加大量的定义,使代码不可读。另外,您是如何导入导出函数的,这可能是一个混乱的问题,因为您很可能正在链接。同样
*.C
意味着
C
code而不是
C++
@HansPassant,至少在当前版本的GCC和Clang中(至少可以追溯到十年前),您可以转发declare struct指针,而无需在头文件中声明它们。实际定义只需要在实际创建结构的“实例”(即变量,访问字段,或者将其大小转换为MalC/Nit)。是的,当C++中的方法被称为“NoNoRunNeX”时,它给出了错误“NoNoNoLeNoW()”,但它不给错误“NoNoNeNoW”,因为该方法被称为“NoNoNoNeNew”。“NeuronNew”因此编译器必须出于某种原因对其进行更改编译器在函数名的开头和结尾添加额外字符是完全正常的(例如,在MacOS上,C中的所有函数