Содержание

Реализационно-зависимое поведение

Это приложение описывает поведение Watcom C/16 и C/32, когда в стандарте говорится, что оно зависит от реализации. Условия, от которых зависит поведение, взяты из стандарта ANSI/ISO на язык C. Числа в скобках в конце условия ссылаются на раздел стандарта, который обсуждает поведение.

Трансляция

Как выводится диагностика (5.1.1.3).

Диагностическое сообщение выводится в виде:

имя-файла(номер-строки): тип-ошибки! номер-ошибки: текст-собщения

где:

имя-файла
имя исходного файла, в котором обнаружена ошибка. Если ошибка была обнаружена в файле, который был включён файлом указанным в командной строке компилятора, то будет выведено имя включённого файла.
номер-строки
номер исходной строки в названном файле, где была обнаружена ошибка.
тип-ошибки
либо слово Error (ошибка) для ошибок, которые не позволяют удовлетворительно завершить компиляцию (код не будет генерирован), либо Warning (предупреждение) для условий обнаруженных компилятором, в результате которых программа может не делать то, что ожидает программист, но в целом верных. Предупреждения не препятствуют генерации кода. Появлением предупреждений можно управлять при помощи ключа командной строки. Подробности см. «User's Guide».
номер-ошибки
буква E (для ошибок), за которой следует четыре цифры номера ошибки, или буква W (для предупреждений), за которой следуют три цифры номера предупреждения. Каждое сообщение имеет свой уникальный номер сообщения.
текст-собщения
описательное сообщение, указывающее на проблему.

Пример:

test.c(35): Warning! W301: No prototype found for 'GetItem' test.c(57): Error! E1009: Expecting '}' but found ','

Окружение

Семантика аргументов функции main (5.1.2.2.1).

В командной строке каждая отделённая пробелом лексема, кроме заключённых в кавычки, составляет стринг, который является элементом argv. Стринги в кавычках образуют один элемент.

Например, для командной строки

pgm 2+ 1 tokens "one token"

argc будет иметь значение 5, а пять элементов argv будут

pgm
2+
1
tokens
one token

Какое устройство используется для взаимодействия с пользователем (5.1.2.3).

В Watcom C/16 и C/32 устройствами для взаимодействия считаются клавиатура и дисплей.

Идентификаторы

Число значимых начальных символов (свыше 31) в идентификаторе без внешней связи (6.1.2).

Не ограничено.

Число значимых начальных символов (свыше 6) в идентификаторе с внешней связью (6.1.2).

Компиляторы Watcom C/16 и C/32 не накладывают ограничений. Watcom Linker ограничивает число значимых символов до 40.

Различается ли регистр в идентификаторах с внешней связью (6.1.2).

Компиляторы Watcom C/16 и C/32 производят имена объектов в смешанном регистре. Watcom Linker имеет опцию для различения или игнорирования регистра при разрешении связей. По умолчанию линкер игнорирует регистр. Подробности см. «Watcom Linker User's Guide».

Символьные типы

Члены исходного символьного набора и набора времени исполнения, за исключением явно указанных в стандарте (5.2.1).

Весь символьный набор IBM PC доступен и в исходном символьном наборе, и в наборе времени исполнения. Множество значений от 0x20 до 0x7F является символьным набором ASCII.

Режим сдвига, которое используется для кодирования многобайтовых символов (5.2.1.2).

Для поддержки многобайтовых символов нет режима сдвига.

Число бит в символе из набора времени исполнения (5.2.4.2.1).

8

Отображение членов исходного символьного набора (в символьных константах и стринговых литералах) на члены набора времени исполнения (6.1.3.4).

Оба, и исходный символьный набор, и набор времени исполнения, являются полными символьными наборами IBM PC, текущей кодовой страницы. Кроме того, в следующей таблице показаны эскейп-последовательности доступные в исходном символьном наборе, и что они собой представляют в наборе времени исполнения.

Эскейп-после-
довательность
Шестн.
значение
Назначение
\a 07 Звонок или предупреждение
\b 08 На символ назад
\f 0C Перевод формата
\n 0A Новая строка
\r 0D Возврат каретки
\t 09 Горизонтальная табуляция
\v 0B Вертикальная табуляция
\' 27 Апостроф или одиночная кавычка
\" 22 Двойная кавычка
\? 3F Знак вопроса
\\ 5C Обратная косая черта
\ooo Восьмеричное значение
\xhh Шестнадцатеричное значение

Значение целой символьной константы, которая содержит символ или эскейп-последовательность, не представленные в символьном наборе времени исполнения или расширенного символьного набора для расширенной символьной константы (6.1.3.4).

Это невозможно. Оба, и исходный символьный набор, и набор времени исполнения, являются символьными наборами IBM PC. Поэтому все символы в исходном наборе прямо отображаются в набор времени исполнения.

Значение целой символьной константы, которая содержит более, чем один символ, или расширенной символьной константы, которая содержит более, чем один многобайтовый символ (6.1.3.4).

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

Текущая локализация, используемая для конвертирования многобайтовых символов в соответствующие расширенные символы (коды), для расширенной символьной константы (6.1.3.4).

В данный момент компиляторы Watcom C/16 и C/32 поддерживают только локализацию «C», используя североамериканский английский, и транслируют 437-ю кодовую страницу в UNICODE.

Для поддержки многобайтовых символов можно использовать ключ командной строки, который указывает, какой использовать многобайтовый символьный набор. Подробности см. «User's Guide».

Чему эквивалентен char без спецификатора типа, signed char или unsigned char (6.2.1.1).

Watcom C/16 и C/32 трактуют char как unsigned, если не используется ключ командной строки компилятора, чтобы сделать его signed.

Целые типы

Представление и наборы значений различных типов целых (6.1.2.5).

Целые хранятся с использованием до двух. Старший бит любого целого со знаком является знаковым. Если знаковый бит равен 1, то значение отрицательно.

Диапазоны различных целых типов описаны в разделе Целочисленные типы.

Результат преобразования целого в более короткое знаковое целое, или результат преобразования беззнакового целого в знаковое целое равной длины, если значение им не может быть представлено (6.2.1.2).

При конвертировании в более короткий тип, старшие биты более длинного значения отбрасываются, а оставшиеся биты интерпретируются в соответствии с новым типом.

Например, конвертирование знакового длинного целого -15584170 (шестнадцатеричное значение 0xFF123456) в знаковое короткое целое в результате даст 13398 (шестнадцатеричное значение 0x3456).

При конвертировании беззнакового целого в знаковое той же длины, биты просто интерпретируются в соответствии с новым типом.

Например, конвертирование беззнакового короткого целого 65535 (шестнадцатеричное значение 0xFFFF) в знаковое короткое целое в результате даст -1 (шестнадцатеричное значение 0xFFFF).

Результат побитовых операций над знаковыми целыми (6.3).

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

Знак остатка при делении нацело (6.3.5).

Остаток имеет тот же знак, что и делимое (левый операнд).

Результат сдвига вправо отрицательного значения знакового целого типа (6.3.7).

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

Например, результатом ((short) 0x0123) >> 4 будет 0x0012. Результатом ((short) 0xFEFE) >> 4 будет 0xFFEF.

Типы с плавающей точкой

Представление и наборы значений различных типов чисел с плавающей точкой (6.1.2.5).

Обсуждены в разделе Типы с плавающей точкой. Используемым форматом плавающей точки является «IEEE Standard for Binary Floating-Point Arithmetic», как определено в «ANSI/IEEE Standard 754-1985».

Правила усечения при конвертировании целого числа в число с плавающей точкой, которое не может точно представить первоначальное значение (6.2.1.3).

Усечение возможно только при конвертировании long int (знакового или беззнакового) во float. Используются старшие 24 бита (включая знаковый). 25-й бит проверяется и, если он равен 1, то значение округляется вверх прибавлением единицы к 24-битному значению. Оставшиеся биты игнорируются.

Правила усечения или округления при конвертировании числа с плавающей точкой в менее ёмкое число с плавающей точкой (6.2.1.4).

Значение округляется до ближайшего значения в меньшем типе.

Массивы и указатели

Тип целого, необходимого для хранения максимального размера массива — то же, что и тип оператора sizeof, size_t (6.3.3.4, 7.1.1).

unsigned int

Результат преобразования целого в указатель и vice versa (6.3.4).

Преобразования Watcom C/16 указателя в целое:

Тип указателя short int
int
long int
near результат — значение указателя регистр DS — в старших 2-х байтах, указатель — в младших 2-х байтах
far
huge
сегмент отбрасывается, результат — смещение указателя (младшие 2 байта) сегмент — в старших 2-х байтах, смещение — в младших 2-х байтах

Преобразования Watcom C/16 целого в указатель:

Целый тип near-указатель far-указатель
huge-указатель
short int
int
результат — значение целого сегмент результата — регистр DS, смещение — значение целого
long int результат — младшие 2 байта целого значения сегмент результата — старшие 2 байта, смещение — младшие 2 байта

Преобразования Watcom C/32 указателя в целое:

Тип указателя short int
long int
near результат — младшие 2 байта значения указателя результат — значение указателя
far
huge
сегмент отбрасывается, результат — младшие 2 байта значения указателя сегмент отбрасывается, результат — смещение указателя

Преобразования Watcom C/32 целого в указатель:

Целый тип near-указатель far-указатель
huge-указатель
short int результат — значение целого с нулями в старших 2-х байтах сегмент результата — регистр DS, смещение — значение целого с нулями в старших 2-х байтах
int
long int
результат — значение целого сегмент результата — регистр DS, смещение — значение целого

Тип целого, необходимого для хранения разницы между двумя указателями на элементы одного и того же массива, ptrdiff_t (6.3.6, 7.1.1).

Если используется огромная модель памяти, то ptrdiff_t имеет тип long int.

Для всех остальных моделей памяти ptrdiff_t имеет тип int.

Если вычитаются два huge-указателя, и при этом используется не огромная модель памяти, то тип результата будет long int, несмотря на то, что ptrdiff_t является int.

Регистры

Непрерывная область в регистрах, в которую реально может быть помещён объект, при использовании спецификатора класса памяти register (6.5.1).

Компиляторы Watcom C/16 и C/32 могут поместить любой, достаточно маленький объект, включая небольшие структуры, в один или более регистров.

Число объектов, которые можно поместить в регистры изменяется, и определяется компилятором. Ключевое слово register не управляет помещением объектов в регистры.

Структуры, объединения, перечисления и битовые поля

Доступ к члену объекта-объединения с использованием члена другого типа (6.3.2.3).

Поведение не определено. Какие бы битовые значения ни были сохранены в одном члене, такие же будут извлечены из другого.

Заполнение и выравнивание членов структуры (6.5.2.1).

По умолчанию компиляторы Watcom C/16 и C/32 не производят выравнивания членов структуры. Можно использовать ключ командной строки или pragma для того, чтобы заставить компилятор выполнять выравнивание. Подробности см. «User's Guide».

Как трактуется битовое поле int без спецификатора типа, signed int или unsigned int (6.5.2.1).

signed int

Расположение битовых полей внутри ячейки памяти (6.5.2.1).

От младшего (менее значимого) бита к старшему биту.

Могут ли битовые поля пересекать границы ячейки памяти (6.5.2.1).

Битовые поля не могут пересекать границы ячейки памяти. Если для хранения очередного битового поля недостаточно места в ячейке памяти, то оно будет помещено в следующую ячейку.

Целый тип выбранный для представления значений перечислимого типа (6.5.2.2).

По умолчанию Watcom C/16 и C/32 будут использовать наименьший целый тип, которым можно представить все значения в перечислении.

Watcom C/16 будет выбирать первый подходящий тип из следующей таблицы:

Тип Наименьшее
значение
Наибольшее
значение
signed char -128 127
unsigned char 0 255
signed int -32768 32767
unsigned int 0 65535

Watcom C/32 будет выбирать первый подходящий тип из следующей таблицы:

Тип Наименьшее
значение
Наибольшее
значение
signed char -128 127
unsigned char 0 255
signed short -32768 32767
unsigned short 0 65535
signed int -2147483648 2147483647
unsigned int 0 4294967295

Оба компилятора имеют ключ командной строки, который делает все перечисления типа int. Подробности см. «User's Guide».

Квалификаторы

Что составляет извлечение из памяти объекта, который имеет тип квалифицированный как volatile (6.5.5.3).

Любая ссылка на volatile-объект одновременно является извлечением его из памяти.

Деклараторы

Максимальное число деклараторов, которые могут модифицировать арифметический, структурный тип или тип объединения (6.5.4).

Ограничено только доступной памятью.

Поведение касающееся команд

Максимальное число меток case в команде switch (6.6.4.2).

Ограничено только доступной памятью.

Директивы препроцессора

Совпадает ли значение односимвольной константы в константном выражении, которое управляет условным включением, со значением той же символьной константы в наборе символов времени исполнения. Может ли такая символьная константа иметь отрицательное значение (6.8.1).

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

Метод поиска включаемых исходных файлов (6.8.2).

Полное описание того, как ищутся включаемые файлы см. «User's Guide».

Поддержка имён включаемых исходных файлов заключённых в кавычки (6.8.2).

Полное описание того, как ищутся включаемые файлы см. «User's Guide».

Отображение символьных последовательностей исходного файла (6.8.2).

Исходный символьный набор и набор времени исполнения совпадают. Эскейп-последовательности в директивах препроцессора не поддерживаются.

Поведение каждой распознанной директивы #pragma (6.8.6).

См. «User's Guide».

Определения для __DATE__ и __TIME__, когда, соответственно дата и время трансляции недоступны (6.8.8).

Дата и время доступны всегда.

Библиотечные функции

Константа null-указатель, в которую расширяется макро NULL (7.1.6).

В Watcom C/16 макро NULL расширяется в 0 для малой и средней моделей памяти (малая модель данных) и в 0L для компактной, большой и огромной моделей памяти (большая модель данных).

В Watcom C/32 макро NULL расширяется в 0.

Реализационно-зависимое поведение библиотечных функций описано в руководстве «Watcom C Library Reference».