2016-02-09 141 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