由于在不存在限定符char时,C++中的a的性质是编译器相关的unsigned,是否有一个参数可以传递给GCC,这会强制所有的chars被编译为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 将语言的某些部分留给了实现,并且通常您希望调整该实现以最适合您的应用程序。在我看来,专业开发人员应该始终检查所有编译器标志并选择最适合他需要的编译器标志。如果您依赖某些特定设置,您的单元测试当然会涵盖该情况或断言它。如果移植应用程序,您将查看原始移植的编译设置。