编译c代码时如何让g++忽略calloc指针类型错误

how to make g++ ignore calloc pointer type error when compiling c code

例如,下面的行可以用 gcc 编译,

float *m = calloc(rows*cols, sizeof(float));

但是 g++ 抱怨指针类型不匹配,如下所示。

../../../../../YOLO/darknet/src/gemm.c:33:22: error: invalid conversion from ‘void*’ to ‘float*

(也许在 C++ 中总是调用 returns void*?)
我可以让 g++ 忽略这个指针类型不匹配错误吗? (我发现了这个 link 但他们说这是不可避免的。如果我们可以从 c++ 代码内部使用 c 代码而不用到处修复它,那就太好了。)

(maybe callc always returns void* in c++?)

是的。 calloc 总是 returns void*。在 C 和 C++ 中。

Can I make g++ just ignore this pointer type mismatch error?

我建议不要试图让编译器忽略错误,而是修复程序。您可以这样修复它:

float *m = static_cast<float*>(std::calloc(rows*cols, sizeof(float)));

如果翻译单元是用 C 语言编写的,则使用 C 编译器对其进行编译。

If we can use c code from inside c++

解决方案:不要在另一种语言中使用一种语言。用C写C,用C++写C++。通过将翻译单元链接在一起,可以实现语言之间的交互。

关于 C++,请阅读其标准草案 n3337 or the newer n4860 draft or buy the official standard from ISO(或您所在国家/地区的等效标准化组织)。

关于C,阅读它的草案标准n1570或从ISO购买官方标准。

对于 C 和 C++,另请参阅 this website

另请阅读这本 Modern C book about C, and that Programming -- Principles and Practice Using C++ 关于 C++ 的书。

如果您使用的是最近的 GCC, and if you are allowed to code some plugin for it, you might code a plugin which conditionally would correct the source code, or suggest and send some correction to your favorite editor (e.g. GNU emacs)。这种方法可能需要数周的努力。

正如 正确解释的那样,您应该改进源代码。

PS。我碰巧有能力编写这样一个 GCC 插件(参见 this draft tech report funded by the CHARIOT 欧洲项目),但我需要获得资金才能这样做。欢迎随时通过电子邮件与我联系。

这个问题的解决方法实际上不是像eerorika建议的那样添加static_cast而是用C编译器编译C代码。 C 和 C++ 之间存在许多可能导致意外结果的细微差异,编译器不会捕获所有这些差异。因此,即使您更改了所有类型警告,您仍可能以损坏的代码告终。

为确保您可以从 C++ 调用 C 代码,您应该在 C headers 中将代码标记为 extern "C",如下所示:

#ifdef __cplusplus
extern "C" {
#endif

[your definitions]

#ifdef __cplusplus
}
#endif