日期:2014-05-16  浏览次数:20784 次

c++与C的混合调用问题
 最近再看一个项目的代码,并做了一些修改,出现了问题:有一个C++的头文件a.h,这个头文件被c和C++文件同时包含,因为这个a.h里的结构体中只有一些基本的数据类型和一些宏定义,所以编译是正常的,但是由于我需要修改代码,就在a.h中加入了C++的vector头文件,用到了vector容器,于是在那些包含了该头文件的C文件就报错。提示说:fatal error: vector :No such file or directory
  我也在网上查了一些关于C++与C混用的讲解,但是基本上都是对于具体的函数,具体的结构体的相互引用,没有说这种C++标准库函数该怎么被C包含,不知道这个问题可以不可以被解决?如果可以,我该怎么做?请大家帮忙。
修改后的代码(就增加红色部分的两行代码,还有#include<vector>):
struct ceph_mds_reply_inode {
__le64 ino;
__le64 snapid;
__le32 rdev;
__le64 version;                /* inode version */
__le64 xattr_version;          /* version for xattr blob */
struct ceph_mds_reply_cap cap; /* caps issued for this inode */
vector<__le64> size;
vector<__le64> ono;

struct ceph_timespec ctime, mtime, atime;
__le32 time_warp_seq;
__le64 size, max_size, truncate_size;
__le32 truncate_seq;
__le32 mode, uid, gid;
__le32 nlink;
__le64 files, subdirs, rbytes, rfiles, rsubdirs;  /* dir stats */
struct ceph_timespec rctime;
struct ceph_frag_tree_head fragtree;  /* (must be at end of struct) */
} ;


修改前的代码:
struct ceph_mds_reply_inode {
__le64 ino;
__le64 snapid;
__le32 rdev;
__le64 version;                /* inode version */
__le64 xattr_version;          /* version for xattr blob */
struct ceph_mds_reply_cap cap; /* caps issued for this inode */
struct ceph_timespec ctime, mtime, atime;
__le32 time_warp_seq;
__le64 size, max_size, truncate_size;
__le32 truncate_seq;
__le32 mode, uid, gid;
__le32 nlink;
__le64 files, subdirs, rbytes, rfiles, rsubdirs;  /* dir stats */
struct ceph_timespec rctime;
struct ceph_frag_tree_head fragtree;  /* (must be at end of struct) */
} ;

------解决方案--------------------
我能告诉你的是C++兼容C,但是C并不完全兼容C,寄出的#define, int等类型到无所谓,特别是你说的这种涉及到C++的数据结构,vector是模板类,在.c里面,template,class肯定会报错。
------解决方案--------------------
把 c 文件改为 cpp 文件,用 g++ 编译
------解决方案--------------------
引用:
把 c 文件改为 cpp 文件,用 g++ 编译


该文件同时被C和C++引用。。


改成cpp,c部分又编译不过了。
------解决方案--------------------
为什么不使用条件编译?
#ifdef __cplus__
    vector<__le64> size;
    vector<__le64> ono;
elseif
    char reserved[size];
endif