从C代码调用C++静态成员函数

Che*_*eng 7 c c++

我有一堆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)

有什么建议吗?

sbi*_*sbi 8

// 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)

  • 这也是我这样做的方式.这种调用者分配样式在C库中非常常见. (2认同)

Dav*_*kes 6

包装器怎么样?

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)

在管理创建和删除时,您必须非常小心.