涉及环境:workbench3.3 、 vxWorks6.9 、 windows7
事件起因:项目组一直用C语言,最近有个模块修改,想使用标准C++ STL里的hash_map,于是新建了一个.cpp文件和.h文件(我们定义为my_hash.h)对hash_map功能进行封装,可是在其他.c文件中引用my_hash.h时却出现了错误,因为该h文件中包含了 #include <hash_map> 文件,这个标准头文件是无法在C语言文件中识别的。
解决经过:
1、在my_hash.h头文件中使用 #ifdef __cplusplus extern"C" 这个,依然不行,发现问题的关键在于my_hash.h头文件中引用了<hash_map>头文件,所以只要.c文件包含 my_hash.h头文件就肯定会出问题(僵硬。。。);
2、上网查阅C/C++互相调用的相关文章,费时不短,无果;
3、请教身边大佬,大佬抛给我一个名词“C语言不完整声明”;
4、查阅不完整声明的相关文章,简单了解原理、学习用法,Amazing! 问题解决了。
附录部分代码:
/* my_hash.cpp ,只粘贴部分关键代码 */
#include <hash_map>
using namespace std;
typedef std::hash_map<int32_t, int32_t> HASH_MAP;
typedef struct _nethash_table_s_
{
HASH_MAP hash_map_node;
}Nethash_table_s;
/* my_hash.h ,只粘贴部分关键代码 */
/* 结构体的不完整声明(避免hash_map头文件出现在C文件中),hash_table结构体的具体实现不向用户暴露 */
typedef struct _nethash_table_s_ Nethash_table_s;
#ifdef __cplusplus
extern "C" {
#endif
/* 声明函数接口 */
#ifdef __cplusplus
}
#endif
简单总结:
C语言的不完整声明(这个特性与函数在.h文件中的声明有些相似),就是在定义之前,只对类型进行一个声明,这样就隐藏了这个类型(接口)的实现细节。
参考文章: