包含标准包含的C头文件(不含C ++ 11)

时间:2016-02-09 13:51:14

标签: c++ extern

我已经查看了同一主题的以下两篇帖子: Post1 Post2。我有类似的问题,但不一样(我猜)。所以在这里发布。对不起,如果它仍然是重复的。

我有一个C-static库(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. 由于point-1
  3. ,不使用C ++ 11来包含相应的CPP定义

    非常感谢你的时间。

1 个答案:

答案 0 :(得分: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_;