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