Gcc:强制编译器默认使用unsigned char

时间:2013-12-11 11:57:55

标签: c++ gcc char unsigned

由于当char限定符不存在时,C ++中unsigned的性质依赖于编译器,是否存在可以传递给GCC的参数强制所有char都要编译为unsigned

5 个答案:

答案 0 :(得分:27)

您正在寻找的旗帜是-funsigned-char

来自the documentation

  

<强> -funsigned-char

     

char类型无符号,例如unsigned char

     

每种机器都有char应该有的默认值。它默认为unsigned char或默认情况下为signed char

     

理想情况下,可移植程序在依赖于对象的签名时应始终使用signed charunsigned char。但是许多程序都被编写为使用普通char并期望它被签名,或者期望它是无符号的,这取决于它们所编写的机器。使用此选项及其反转,可以使此类程序使用相反的默认值。

     

类型char始终是signed charunsigned 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');

显示-128128

关于不依赖于特定编译设置的评论是有效的,但这里有点简化现实。主要问题是出于效率原因,C将语言的某些部分留给了实现,并且通常您希望调整该实现以适合您的应用程序。在我看来,专业开发人员应该始终通过所有编译器标志,并根据他的需要选择最佳。如果您依赖某些特定设置,单元测试当然会涵盖该情况,或者声明它。如果移植应用程序,则将查看原始端口的编译设置。

答案 3 :(得分:0)

您可以使用-funsigned-char,或-fsigned-char签名。

答案 4 :(得分:0)

您可以使用选项:-funsigned-char

source

相关问题