2016-02-09 44 views
2

我已經看過以下兩篇文章對同一主題: Post1Post2。我有一個類似的問題,但不一樣(我猜)。所以張貼在這裏。對不起,如果它仍然是重複的。包含C頭文件包含標準包含(不包括C++ 11)

我有一個C靜態庫(libComm.a),其中包含以下..

comm.h實現:

#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 
#include <string.h> 
#include <math.h> 
..... 
typedef struct _CDef {} CommDef; 

而且我得到這個文件的形式提供。無論如何,我無法改變它。除了這個我也有另外一個.cpp的庫(libfw.a):

fw.h:

namespace fw { namespace ipc { 
class A { ...... }; 
} } 

我的目標是同時使用在我的C庫++應用程序:

myCppApp.cpp

#include "fw.h" 
extern "C" { 
#include "comm.h" 
} 

namespace chat { namespace comm { 
class CppApplication 
{ 
private: 
    CommDef def; 
    fw::ipc::A ipc; 
}; 
} 
} 

當我想要編譯,編譯器無法找到, 「FW :: IPC :: A」。但是,如果我不使用C頭和相應的數據類型,一切工作正常。

我意識到這是因爲我包含的頭文件包含標準C包含文件。所以,我的問題是如何解決這個問題,編譯和成功結束鏈接到lib,符合下列條件:

  1. 在不改變交付來源
  2. 不使用C++ 11包括相應的CPP定義因爲點1

非常感謝您的時間。

+0

你不應該包括C頭文件('stdxxxx.h')在C++程序中。改用它們的C++版本('cstdxxxx')。 – user3528438

+0

這不是我的選擇,因爲它們僅在C++ 11中定義,並且由於內部性能和其他可移植性問題,我無法使用C++ 11。 – PSN

+2

不一定,'cmath' /'cstring' ...都是可用的,因爲C++ 98 – user3528438

回答

2

問題在於C標頭正在污染預處理器,並使用#define s。一種可能性是,清理後用#undef

extern "C" { 
#include "comm.h" 
} 
#undef ipc 
// ... 

另一種選擇是增加別名的C頭使得人跡罕至的名字,包括前:

#include "fw.h" 
typedef fw::ipc::A fw_ipc_A; 
extern "C" { 
#include "comm.h" 
} 
// ... 
fw_ipc_A ipc_; 
+0

感謝您的回答。我嘗試了第二個提議並解決了這個問題。但是,請您根據我的理解詳細說明您的意思:「用define定義來污染預處理器」。 – PSN

+0

@PSN請參閱http://stackoverflow.com/questions/30742148/why-is-it-not-advised-to-define-macros-in-header-files?rq=1 – ecatmur

+0

我明白並完全同意它。事實上,我使用的C庫有數百個定義。對不起,在我之前的評論中沒有具體說明,但是我想了解的是,你是如何得出這個錯誤的結論的,只要看看錯誤消息本身就是非自我解釋的東西。再次感謝。 – PSN