如何避免简单的“字符”的海湾合作委员会警告:“无符号字符”或“签名字符”转换?

我的默认chartypes是在gcc选项(-funsigned-char gcc)中设置的“unsigned char”。 所以可以说,当我需要代码中的“无符号字符”时,我可以使用“char”。 但我得到(char *)和(unsigned char *或signed char *)之间的转换警告:

"error: pointer targets in passing argument 1 of 'test2' differ in signedness"

当我将unsigned char *variables传递给char时,我该如何避免警告(知道我的系统具有由编译器选项设置的默认无符号字符)?

 static void test2(char* a) //char is unsigned by deafult as set by -funsigned-char gcc option { } void test1(void) { // This passes, but if i change it to unsigned char (or 'signed char') it fails // I dont want it to fail for "unsigned char c" since default char is unsigned. char c = 65; test2(&c); } 

开关-funsigned-char-fsigned-char不引用char *

您可以使用-Wno-pointer-sign来关闭收到的警告。

使用演员:

 char c = 65; // weird magic :-( test2((unsigned char *)(&c)); 

所有的char类型都是布局兼容的,并且转换它们的指针不会构成类型双击或违反锯齿规则,所以您可以自由地执行此操作。

正确的解决方案是将正确类型的变量传递给函数,即如果函数需要普通字符,则声明一个普通字符并取其地址,依此类推。

C标准说“char”,“signed char”和“unsigned char”是不同的类型。 “char”必须与编译器开关确定的“signed char”或“unsigned char”具有相同的行为,但不能互换使用。 无论使用-funsigned-char还是不使用,都应该编写完全一样的代码。

另一张海报使用一个演员的建议是不好的。 所有这一切都是压制警告,明确地禁用警告(例如,用一个杂注,或在你的生成文件全局关闭警告)会更清楚。

转换不能解决代码的问题,它只是停止编译器指出。 这是一个有点学术的观点,但是在一个非2的补码系统中,带符号的字符可能具有陷阱表示(它们的值是0 <= x <= CHAR_MAX而不是其他值的布局兼容)。 所以代码可能会崩溃。

根据您提供的细节,实际上您的最佳解决方案可能只是禁用警告,并且认为代码在这方面是不可移植的。

最后我得到了一个答案:

-Wpointer-sign由-Wall和-pedantic来暗示。 避免警告使用-Wno-pointer-sign