C library in C++

C library in C++

本文关键字:C++ in library      更新时间:2023-10-16

我在c++中使用C库有一个问题。我担心解决办法很容易,但我太笨了,得不到它。

标准库是这样定义这个函数的:

CAENHVLIB_API CAENHVRESULT  CAENHV_GetChName(int handle, ushort slot, 
   ushort ChNum, const ushort *ChList, char (*ChNameList)[MAX_CH_NAME]);

在示例中,它是这样被调用的:

char  (*listNameCh)[MAX_CH_NAME];
// ... leaving out the other lines since they are not the problem ...
listNameCh = malloc(MAX_CHANNELS*MAX_CH_NAME);
ret = CAENHV_GetChName(handle, slot, NrOfCh, listaCh, listNameCh);

现在问题来了。在c++中,我不能使用malloc(MAX_CHANNELS * MAX_CH_NAME),因为我不能正确地转换它。它与"-fpermissive"-Flag一起工作,但我不想这样做。

有人知道怎么解决这个问题吗?

欢呼

好吧,你可能可以正确地转换它以避免-fpermissive .

第一级这不是一个hack - C和c++对这里的隐式强制转换有不同的规则。如果你坚持用c++写C,你需要偶尔的强制转换来使它工作。

在另一个层面上,问题是你正在编写C并将其编译为c++。最好是

  1. 将其重写为良好的、惯用的c++。您应该能够使用std::array<char[MAX_CH_NAME], MAX_CHANNELS>,它将为您处理分配
    • 或者你也可以使用std::vector<char[MAX_CH_NAME]>,如果你想调整它的大小
  2. 将其重写为不太好的c++,用显式的new/delete代替malloc/free (new表达式是强类型的,不需要强制转换)
  3. 在C语言模块中编写C代码,暴露一些相同的接口,然后从c++中调用

您可以使用mallocnew。如果使用malloc,则必须强制转换返回值。如果使用new,则不必强制转换。

listNameCh = (char (*)[MAX_CH_NAME])malloc(MAX_CHANNELS*MAX_CH_NAME);

listNameCh = new char[MAX_CHANNELS][MAX_CH_NAME];