C option du compilateur pour ignorer signe
-
20-09-2019 - |
Question
Je traite actuellement avec le code acheté auprès d'un tiers entrepreneur. Un struct a un champ unsigned char tandis que la fonction qu'ils passent à ce champ nécessite un signed char. Le compilateur n'aime pas, car il les considère comme des types dépareillées. Cependant, il compile apparemment pour cet entrepreneur. Quelques recherches sur Google m'a dit que « [i] t est défini par l'implémentation si un objet char peut contenir des valeurs négatives ». Le compilateur de l'entrepreneur pourrait ne pas tenir compte essentiellement du type signé / non signé et les traiter de la même chose? Ou est-il un indicateur de compilateur qui les traitera les mêmes?
C est pas ma langue la plus forte - il suffit de regarder mes tags sur ma page d'utilisateur -. De sorte que toute aide serait appréciée
La solution
En fait char
, signed char
et unsigned char
sont trois types différents. De la norme (ISO / IEC 9899: 1990):
6.1.2.5 Types
...
Les trois types char , signed char unsigned char sont collectivement appelés les types de caractères .
(et en C ++ par exemple, vous devez (ou au moins devrait) écrire des fonctions de remplacement avec trois variantes d'entre eux si vous avez un argument char)
char ordinaire peut être traité signé ou non par le compilateur, mais la norme dit (aussi 6.1.2.5):
Un objet déclaré en tant que type char est assez grand pour stocker tout membre le caractère d'exécution de base défini. Si un membre de la source requis jeu de caractères 5.2.1 est stocké dans un char objet, sa valeur est garantie être positif. Si d'autres quantités sont stockées dans un char objet, comportement est défini par l'implémentation: les valeurs sont considérées comme étant soit signé ou des entiers non négatifs.
et
Un objet déclaré comme type char signé occupe la même quantité de stockage en tant que '' simple '' char objet .
Les caractères visés au 5.2.1 sont A-Z, a-z, 0 à 9, l'espace, tabulation, nouvelle ligne et les 29 caractères graphiques ci-dessous:
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
Réponse
Tous que j'interprète signifie essentiellement que les caractères ascii ayant une valeur inférieure à 128 sont garantis positifs. Donc, si les valeurs stockées sont toujours inférieure à 128, il doit être sûr (d'une valeur en préservant la perspective), mais pas si bonnes pratiques.
Autres conseils
Cela dépend compilateur. Par exemple, dans VC ++ il y a une option de compilation et une macro correspondante définie _CHAR_UNSIGNED si cette option indique à utiliser unsigned char par défaut.
Je suppose que vous parlez des champs de type signed char
et unsigned char
, ils sont donc explicitement faux. Si l'un d'entre eux était tout simplement char
, il pourrait correspondre à ce que l'entrepreneur compilateur utilise (IIRC, il est défini par l'implémentation si char
est signed
ou unsigned
), mais pas dans le vôtre. Dans ce cas, vous pourriez être en mesure d'obtenir avec une option de ligne de commande ou quelque chose à changer la vôtre.
Sinon, l'entrepreneur utilise peut-être un compilateur ou des options du compilateur, qui lui permettent de compiler tout en ignorant des erreurs ou des avertissements. Savez-vous quel type d'environnement de compilation qu'il a?
Dans tous les cas, ce n'est pas bon C. Si l'un des types est juste char
, elle repose sur le comportement de l'implémentation, et est donc pas portable. Sinon, il est faux plat. Je prends cela avec l'entrepreneur.