【问题标题】:Converting C program to C++ with lot of char* and unsigned char conversion errors将 C 程序转换为具有大量 char* 和 unsigned char 转换错误的 C++
【发布时间】:2018-10-20 08:05:57
【问题描述】:

我需要使用RFC2617RFC1321 中描述的方法,但在将 C 转换为 C++ 时遇到问题。大多数情况下,我对参数定义为unsigned char 有问题,但参数是char* 变量。
我可以使用reinterpret_cast 解决错误,但我认为会有更好的方法,因为需要做很多更改。

例如在md5c.c下面的行中,变量pszUserName被声明为char*,如果变量改为unsigned char*,那么strlen就会出错:

IN char * pszUserName,
...
MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));

MD5Update 声明

void MD5Update (
    MD5_CTX *context,                                        /* context */
    unsigned char *input,                                /* input block */
    unsigned int inputLen                      /* length of input block */
)
{
...
}

我首先得到了这个错误:

../Dig/digcalc.cpp: In function ‘void DigestCalcHA1(char*, char*, char*, char*, char*, char*, char*)’:
../Dig/digcalc.cpp:44:58: error: invalid conversion from ‘char*’ to ‘unsigned char*’ [-fpermissive]
       MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));

Github也有不错的文案

【问题讨论】:

  • 您可以使用编译器标志-Wno-pointer-sign 来抑制这些消息
  • 使用vector<unsigned char>,它解决了strlen() 不起作用的问题。无论如何,我可以猜到你的问题是什么,即使描述有点模糊,但为了提出解决方案,我需要更广泛地了解你在做什么。可能范围太广,无法在此处发布。
  • 建议使用“引用”参数而不是指针参数
  • @user3629249,你能给我举个例子吗?
  • 如果您了解 C++,那么您会在函数签名中的参数名称之后了解 &。这样的& 允许被调用函数访问调用函数中的原始数据,而无需传递地址,也不必让我们* 取消引用地址指针。这就是简单的解释。

标签: c++ c type-conversion


【解决方案1】:

从技术上讲,charunsigned charsigned char 是彼此不兼容的类型。代码:

MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));

“应该”是:

MD5Update(&Md5Ctx, (char *)pszUserName, strlen(pszUserName)); 

但是,在我看来,这一切都很烦人。 MD5Updatecharunsigned char 上的效果一样好;我们不应该无缘无故地降低代码的可读性。

在像这样交替使用char *unsigned char * 的现有代码库上,我启用了编译器标志-Wno-pointer-sign,并且对此并不感到难过。它使代码更具可读性,并且编译器的行为就像有强制转换一样。

【讨论】:

  • 我得到:command line option ‘-Wno-pointer-sign’ is valid for C/ObjC but not for C++
  • @SAMPro 哦。您也不应该尝试“将 C 编译为 C++”。将 C 文件编译为 C。编写新的 C++ 代码时,请遵守规则。
  • 但我所有的努力都是将该代码转换为 C++,如标题所示。
猜你喜欢
  • 1970-01-01
  • 2020-05-03
  • 2018-03-27
  • 2011-10-19
  • 2013-09-23
  • 2013-07-21
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多