2016-11-12 206 views
0

我的第一個部分是爲一個非常古老的遊戲(Wolfenstein-3D)編寫代碼。它需要使用Borland C++ v3.1編譯器。這是我目前擁有的代碼,但它在Borland編譯器中給出錯誤。有任何想法嗎?將C++代碼鏈接到Borland C++ 3.1編譯器中的C

錯誤在編譯器: Error In Compiler

Neuron.h

#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); 

Neuron.cpp

#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++代碼中有一些編譯器無法處理的'新'

+0

根本沒有編譯任何C++代碼。所以它不是一個C++編譯器。你只給了一個typedef,struct必須被定義在某處*。我們看不到它,編譯器也不能。 –

+0

有趣的是,你如何提出定義結構以使編譯器至少不會產生錯誤。自從我寫了C並嘗試修改typedef struct Neuron {int ans; }神經元;沒有做任何事情。有趣的是代碼在CLion中編譯並運行良好,這就是爲什麼我導致相信潛在的問題是Borland。 – Gary

+0

確保在C文件中使用'NeuronNew'而不是'_Neuron_new'。 –

回答

0

錯誤消息看起來非常像您從其他編譯器獲得的錯誤消息爲您的課堂構建.cpp文件。它不是在抱怨NeuronNew,而是在_Neuron_new(注意小寫字母'n'和額外的下劃線),所以這可能是Borland命名構​​造函數/析構函數的原因嗎?

它是否成功編譯.cpp和C++?文件後綴映射是否與編譯器中的那些相關聯?您是否已將無效代碼添加到#ifdef __cplusplus行以確認是否定義了有史以來,而不是總是定義(如0或1)?你是否對所有包含,文件名和Makefile /項目使用相同的大小寫,以便找到它們?

哦,你試圖做:

typedef struct Neuron* NeuronPtr; 

,然後使用NeuronPtr代替Neuron*在C包裝? C++編譯器不應該在意(只要在__cplusplus部分中執行typedef class Neuron* NeuronPtr;),但這意味着它可能不再嘗試解析任何C代碼中的前向聲明結構。

+0

是的,當C++中的方法被稱爲「Neuron_new」時,它給出錯誤「_Neuron_new()」,但它沒有給出錯誤「_NeuronNew」,因爲方法是稱爲「NeuronNew」,因此編譯器必須由於某種原因對其進行更改 – Gary

+0

編譯器向函數名稱的開始和結尾添加額外字符是完全正常的(例如,在MacOS中,C中的所有函數都在引擎蓋下用下劃線作爲前綴按照慣例),即使當C++的名稱修改關閉時也是如此。但我還沒有看到一個編譯器改變了中間的東西。 C++方法在某些時候會變成常規函數,這可以解釋'_Neuron_new'。如果Borland以不同的方式命名構造函數,但是'Neuron_new'是'NeuronNew'的舊名稱,也許你沒有做一個乾淨的構建?你有沒有嘗試刪除像'.o'等中間文件? – uliwitness