2014-06-07 90 views
0

我的程序在Windows上編譯沒有問題。在Windows上我正在使用conio.h在Linux上,我正在使用替換enter link description here。我的第一個錯誤:typedef enum {FALSE=0x00, TRUE=0xff} BOOL;和錯誤:conio.h和linux問題

types.h:39:15: error: expected identifier before numeric constant 
types.h:39:15: error: expected ‘}’ before numeric constant 
types.h:39:15: error: expected unqualified-id before numeric constant 
types.h:39:36: error: expected declaration before ‘}’ token 
+0

那麼你在第39行第15或36行中找到了什麼? – alk

+0

這是這行:'typedef enum {FALSE = 0x00,TRUE = 0xff} BOOL;' – Krzysiek

+0

而第15列和第36列是? – alk

回答

1

所以問題是如何避免重新定義TRUE/FALSE和BOOL。

當移植C應用程序時,最好有一個頭文件,它定義了您所接入的各種系統的功能,並將機器特定的邏輯保存在一個地方。

然後在你的來源,你可以工作輪做這樣的事情:

#include "machine.h" 

#if HAS_BOOL 
    #define FALSE myFALSE 
    #define TRUE myTRUE 
    #define BOOL myBOOL 
#endif 

#ifndef HAS_32bit_LONG 
    /* long is 64bit */ 
    ... 
#endif 

然後包括你的types.h中的系統文件和machine.h後,將避免試圖重新definintion。在machine.h中,你可以找出你正在編譯的機器(或者爲C編譯器設置你自己的-D參數),並設置相應的功能,以啓用代碼。雖然這可能看起來像是矯枉過正,但當你「只」做一個端口時,如果稍後再移植到OSX上,會讓事情變得更容易。

它看起來很脆弱,但是使用這種策略,允許使用替代信號包,在需要時改進malloc版本,對原始版本的干擾最小,因此爲所有目標保留一個源代碼庫。

4

的類型定義的衝突與#define語句或真或假的一些其他頭。

+0

如何解決它? – Krzysiek

+0

當我在widnows上編譯時,一切正常 – Krzysiek

+0

但是你不在windows上,所以你需要避免定義TRUE&FALSE,我已經提交了一個解釋傳統的UNIX策略(在autoconf工具之前)將端口C程式。 – Rob11311