【发布时间】:2021-12-17 19:51:44
【问题描述】:
我有一个 C 语言的大型程序,我想将某些 C++ 对象与地图等一起使用。 我关注了this post 如何从 C 调用 C++,我的两个 C++ 看起来像这样。
///map.cc
#include "map.h"
void* createMap()
{
std::map<int,int> *m = new std::map<int,int>();
return static_cast<void*>(m);
}
void putInMap(int key, int value, void* opaque_map_ptr){
std::map<int,int> *m = static_cast<std::map<int,int>*>(opaque_map_ptr);
m->insert(std::pair<int,int>(key,value));
}
//map.h
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
EXTERNC void* createMap();
EXTERNC void putInMap(int key, int value, void* opaque_map_ptr);
我不清楚的是,如果我在我的 C 程序中执行以下调用,我如何确定我的 Map 存在以及如何使其全局化?我只是将相应的指针设为全局吗?
#include "map.h"
//How do I let everyone use this map
void* ptr = createMap();
【问题讨论】:
-
您必须将
extern "C"添加到map.cc。how can I be sure my Map exists and how would I make it global?为什么不直接运行代码?map.cc是否包含map.h?map.cc中没有#include <map>吗?为什么最后一个代码sn-p中的代码在函数之外?EXTERNC是否受到#ifdef __cplusplus的保护? -
"如果我在我的 C 程序中执行以下调用" - 但你不能这样做。 C 要求所有具有静态存储持续时间的对象都由常量表达式初始化。
-
@KamilCuk 为什么还需要将 extern "C" 添加到 map.cc 中?其余的东西存在于真实文件中,createMap() 是从一个大函数中调用的。
-
这不是初始化 C++ 对象,而是初始化指针。 C 不允许您在静态对象的初始化程序中调用函数。
-
关于 C 中的全局指针:保留默认初始化并正确初始化它,就像您在
main函数中所做的第一件事一样。为此,我推荐一个像往常一样具有 extern 声明的头文件,并将变量定义在与主函数相同的文件中。