Флаг компилятора C для игнорирования знака - PullRequest
3 голосов
/ 01 сентября 2009

В настоящее время я работаю с кодом, приобретенным у стороннего подрядчика. Одна структура имеет поле без знака, в то время как функция, которой они передают это поле, требует подписанного символа. Компилятору это не нравится, так как он считает их несовпадающими типами. Тем не менее, он, очевидно, компилируется для этого подрядчика. Некоторые из Google сказали мне, что «[i] t определяется реализацией, может ли объект char содержать отрицательные значения». Может ли компилятор подрядчика игнорировать подписанный / неподписанный тип и обращаться с ними одинаково? Или есть флаг компилятора, который будет обрабатывать их одинаково?

C не мой самый сильный язык - просто посмотрите на мои теги на моей странице пользователя - так что любая помощь будет высоко ценится.

Ответы [ 3 ]

3 голосов
/ 01 сентября 2009

На самом деле char, signed char и unsigned char - это три разных типа. Из стандарта (ISO / IEC 9899: 1990):

6.1.2.5 Типы

...

Три типа символ , символ со знаком и беззнаковый символ вместе называются типы символов .

(а в C ++, например, вы должны (или, по крайней мере, должны) написать переопределяющие функции с тремя их вариантами, если у вас есть аргумент char)

Простой символ может быть обработан компилятором как подписанный или неподписанный, но стандарт гласит (также в 6.1.2.5):

Объект, объявленный как тип char is достаточно большой, чтобы хранить любой член основной набор символов выполнения. Если член требуемого источника набор символов в 5.2.1 хранится в char объект, его значение гарантировано быть позитивным. Если другие количества хранятся в объекте char , поведение определяется реализацией: значения рассматриваются как целые числа со знаком или неотрицательные числа.

и

Объект, объявленный как char со знаком типа, занимает тот же объем памяти, что и обычный объект char .

Символами, указанными в п. 5.2.1, являются A-Z, a-z, 0-9, пробел, табуляция, новая строка и следующие 29 графических символов:

! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~ 

Ответ

Все это, как я понимаю, означает, что символы ascii со значением меньше 128 гарантированно будут положительными. Поэтому, если сохраненные значения всегда меньше 128, это должно быть безопасно (с точки зрения сохранения значений), хотя и не очень хорошая практика.

1 голос
/ 01 сентября 2009

Это зависит от компилятора. Например, в VC ++ есть опция компилятора и соответствующий макрос _CHAR_UNSIGNED, определенный, если эта опция указывает использовать по умолчанию неподписанный символ.

0 голосов
/ 01 сентября 2009

Я так понимаю, вы говорите о полях типа signed char и unsigned char, поэтому они явно ошибочны. Если бы один из них был просто char, он мог бы соответствовать в любом компиляторе, который использует подрядчик (IIRC, это определяется реализацией, является ли char signed или unsigned), но не в вашем В этом случае вы можете обойтись с параметром командной строки или чем-то, что может изменить ваш.

В качестве альтернативы подрядчик может использовать компилятор или параметры компилятора, которые позволяют ему компилировать, игнорируя ошибки или предупреждения. Вы знаете, какая у него среда компиляции?

В любом случае это не очень хороший C. Если один из типов просто char, он зависит от поведения, определенного реализацией, и поэтому не переносим. Если нет, то это неправильно. Я бы обсудил это с подрядчиком.

...