C library in 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一起工作,但我不想这样做。
有人知道怎么解决这个问题吗?
欢呼
好吧,你可能可以正确地转换它以避免-fpermissive
.
第一级这不是一个hack - C和c++对这里的隐式强制转换有不同的规则。如果你坚持用c++写C,你需要偶尔的强制转换来使它工作。
在另一个层面上,问题是你正在编写C并将其编译为c++。最好是
- 将其重写为良好的、惯用的c++。您应该能够使用
std::array<char[MAX_CH_NAME], MAX_CHANNELS>
,它将为您处理分配- 或者你也可以使用
std::vector<char[MAX_CH_NAME]>
,如果你想调整它的大小
- 或者你也可以使用
- 将其重写为不太好的c++,用显式的new/delete代替malloc/free (new表达式是强类型的,不需要强制转换)
- 在C语言模块中编写C代码,暴露一些相同的接口,然后从c++中调用
您可以使用malloc
或new
。如果使用malloc
,则必须强制转换返回值。如果使用new
,则不必强制转换。
listNameCh = (char (*)[MAX_CH_NAME])malloc(MAX_CHANNELS*MAX_CH_NAME);
或
listNameCh = new char[MAX_CHANNELS][MAX_CH_NAME];
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp