我有一堆C代码.我无意将它们转换为C++代码.
现在,我想调用一些C++代码(我不介意修改C++代码,以便它们可以通过C代码调用).
class Utils {
public:
static void fun();
}
class Utils2 {
public:
static std::wstring fun();
}
Run Code Online (Sandbox Code Playgroud)
如果我倾向于使用以下语法调用它们,它们将不会编译(我使用的是VC++ 2008,扩展名为.c的C代码文件)
Utils::fun();
// Opps. How I can access std::wstring in C?
Utils2::fun();
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
// c_header.h
#if defined(__cplusplus)
extern "C" {
#endif
void Utils_func();
size_t Utils2_func(wchar_t* data, size_t size);
#if defined(__cplusplus)
}
#endif
//eof
// c_impl.cpp
// Beware, brain-compiled code ahead!
void Utils_func()
{
Utils::func();
}
size_t Utils2_func(wchar_t* data, size_t size)
{
std::wstring wstr = Utsls2::func();
if( wstr.size() >= size ) return wstr.size();
std::copy( wstr.begin(), wstr.end(), data );
data[wstr.size()] = 0;
return str.size();
}
//eof
Run Code Online (Sandbox Code Playgroud)
包装器怎么样?
extern "C" void Utilsfun(int i){Utils::fun(i);}
Run Code Online (Sandbox Code Playgroud)
更新:
这就是你如何从C调用C++函数,但从C访问std :: wstring是另一回事.
如果您真的想从C代码中操作C++类,那么您可以创建一个API,其中使用C++函数对类进行操作,并使用void指针将其传递回C. 我已经看过它,但它并不理想
extern "C"
{
void * ObjectCreate(){return (void *) new Object();}
void ObjectOperate(void *object, char *parameter){((Object*)object)->Operate(parameter);}
void ObjectDelete(void *object){delete ((Object*)object);}
}
Run Code Online (Sandbox Code Playgroud)
在管理创建和删除时,您必须非常小心.