繁体   English   中英

C ++中的C库

[英]C library in C++

我在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一起使用,但我想在没有这种hack的情况下进行操作。

有人知道如何解决这个问题?

干杯

好吧,您可能可以正确地将其-fpermissive以避免-fpermissive

在一个层次上,这不是黑客-C和C ++在这里有不同的隐式强制转换规则。 如果您坚持用C ++编写C,则需要偶尔进行强制转换以使其起作用。

在另一方面,问题在于您正在编写C并将其编译为C ++。 要么更好

  1. 将其重写为良好的惯用C ++。 您应该可以使用std::array<char[MAX_CH_NAME], MAX_CHANNELS> ,它将为您处理分配
    • 或者如果您想调整大小,可以类似地使用std::vector<char[MAX_CH_NAME]>
  2. 用显式new / delete代替malloc / free将它重写为效果不佳的C ++(新表达式是强类型的,不需要强制转换)
  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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM