将 C 程序转换为具有大量字符* 和无符号字符转换错误的C++

Converting C program to C++ with lot of char* and unsigned char conversion errors

本文关键字:字符 无符号 错误 C++ 转换 程序转换      更新时间:2023-10-16

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

例如md5c.c变量pszUserName的以下行中声明为 char*,如果变量更改为unsigned char*,则strlen出现错误:

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

MD5更新声明

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中还有一个不错的副本。

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

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

"应该"是:

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

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

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