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

问题描述 投票:9回答:5

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

c++ gcc char unsigned
5个回答
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


5
投票

正如其他答案所说,gcc的-funsigned-char选项迫使普通的char无条件。

但这可能不是解决您问题的最佳方案。您需要无符号字符,但是通过使用特定于编译器的选项,您可以在构建命令(Makefile,构建脚本或您键入的命令来编译代码)中编码该信息。如果程序的语义依赖于无符号字符,最好在源代码中记录该信息。它更清晰,它减少了某人错误地构建程序的机会。

如果你想要无符号字符,请使用unsigned char。如果您想要签名字符,请使用signed char。如果你只想要字符,并且你确定你的程序的行为不依赖于它们是有符号还是无符号(例如,如果所有存储的值都在0..127范围内),请使用char


3
投票

没有足够的声誉评论@ Keith的回答。

我看到使用-funsigned-char-fsigned-char的主要原因是你想要下面的代码

  printf("%d\n",'\x80');

显示-128128

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


0
投票

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


0
投票

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

source

© www.soinside.com 2019 - 2024. All rights reserved.