由于当char
限定符不存在时,C ++中unsigned
的性质依赖于编译器,是否存在可以传递给GCC的参数强制所有char
都要编译为unsigned
?
答案 0 :(得分:27)
您正在寻找的旗帜是-funsigned-char
。
<强>
-funsigned-char
强>让
char
类型无符号,例如unsigned char
。每种机器都有
char
应该有的默认值。它默认为unsigned char
或默认情况下为signed char
。理想情况下,可移植程序在依赖于对象的签名时应始终使用
signed char
或unsigned char
。但是许多程序都被编写为使用普通char
并期望它被签名,或者期望它是无符号的,这取决于它们所编写的机器。使用此选项及其反转,可以使此类程序使用相反的默认值。类型
char
始终是signed char
或unsigned char
中每个类型的不同类型,即使其行为始终与这两者中的一种相似。
<强>
-fsigned-char
强>让类型
char
签名,例如signed char
。请注意,这相当于
-fno-unsigned-char
,这是-funsigned-char
的否定形式。同样,选项-fno-signed-char
相当于-funsigned-char
。
答案 1 :(得分:5)
正如其他答案所说,gcc的-funsigned-char
选项强制普通char
无签名。
但这可能不是解决问题的最佳方法。您需要无符号字符,但是通过使用特定于编译器的选项,您可以在构建命令(Makefile,构建脚本或您键入的命令以编译代码)中对该信息进行编码。如果程序的语义依赖于无符号字符,那么在源代码中记录该信息会更好。它更清晰,它可以减少某人错误构建程序的机会。
如果您想要使用unsigned char
无符号字符。如果您想要签名字符,请使用signed char
。如果您只想要字符,并且确定您的程序的行为并不取决于它们是否已签名或未签名(例如,如果所有存储的值都在0范围内。 127),使用char
。
答案 2 :(得分:3)
没有足够的声誉评论@ Keith的答案。
我认为使用-funsigned-char
或-fsigned-char
的主要原因是您需要以下代码
printf("%d\n",'\x80');
显示-128
或128
。
关于不依赖于特定编译设置的评论是有效的,但这里有点简化现实。主要问题是出于效率原因,C将语言的某些部分留给了实现,并且通常您希望调整该实现以适合您的应用程序。在我看来,专业开发人员应该始终通过所有编译器标志,并根据他的需要选择最佳。如果您依赖某些特定设置,单元测试当然会涵盖该情况,或者声明它。如果移植应用程序,则将查看原始端口的编译设置。
答案 3 :(得分:0)
您可以使用-funsigned-char
,或-fsigned-char
签名。
答案 4 :(得分:0)
您可以使用选项:-funsigned-char
。