如何使用CLASS宏调用此方法?



我最近收到一个熟人的请求,在他们的开发人员不幸去世后,他想帮助我构建一个c++解决方案。我对c++比较陌生,不太明白下面这些行是做什么的。

这段代码来自Dave Coffin自定义的draw .cpp库。

宏定义为

#define CLASS

被调用的方法看起来像这样

void CLASS merror (void *ptr, char *where)
{
if ( ptr ) return;
//fprintf (stderr,_("%s: Out of memory in %sn"), ifname, where);
sprintf (PSstring(),"%s: Out of memory in %sn", ifname, where);
PSputDiag ();
longjmp (failure, 1);
}

方法调用看起来像这样

merror (fimg, "wavelet_denoise()");

当尝试编译代码时,我收到大约1800个错误,其中258个类似于以下内容。

C2664 'void error(void *,char *)':无法将参数2从'const char[15]'转换为'char *' photoshot 5 C:UserssourceprojectnameMVDcraw.cpp 991

我已经搜索了相当长的一段时间来弄清楚发生了什么,但是因为我甚至不知道方法调用是做什么的,所以我无法找到任何相关的东西。

任何帮助都将是非常感激的。

#定义类

与你的错误无关。宏展开后,函数为:

void merror (void *ptr, char *where)
{
if ( ptr ) return;
//fprintf (stderr,_("%s: Out of memory in %sn"), ifname, where);
sprintf (PSstring(),"%s: Out of memory in %sn", ifname, where);
PSputDiag ();
longjmp (failure, 1);
}

也就是说,宏没有被替换。

代码似乎是在c++ 11之前编写的。从cppreference…

直到c++ 11:

字符串字面值可转换和赋值给非const char*或wchar_t*,以便与C兼容,其中字符串字面值类型为char[N]和wchar_t[N]。不推荐使用这种隐式转换。

从c++ 11:

字符串字面值不能转换或赋值给非const CharT*。如果需要这样的转换,必须使用显式强制转换(例如const_cast)。

将字符串字面值转换为char*从来都不是可以的,但只有在c++ 11之后才会出现错误。如果使用c++ 17,可以使用std::string::data():

std::string where{"wavelet_denoise()"};
merror (fimg, where.data());

实际上更好的是改变方法,正如Richard Critten在评论中建议的那样,采取const char* where

最新更新