Некоторые аспекты языка Си стандарта ANSI не определены ANSI достаточно подробно. В таких случаях каждая реализация компилятора Си может сама определять отношение к этим аспектам. Ниже говорится о том, как эти зависящие от реализации стандарты определены фирмой Borland. Номера разделов соответствуют здесь публикации стандарта ANSI от февраля 1990 года, которая является самой новой. Отметим, что между Си и С++ имеются различия, а данное приложение относится исключительно к Си.
Как идентифицировать диагностические сообщения
При запуске с правильной комбинацией параметров любое сообщение, выдаваемое компилятором и начинающееся словами Fatal, Error или Warning, считается диагностическим в смысле, определяемом ANSI. Ниже приводятся параметры, необходимые для того, чтобы обеспечивалась данная интерпретация:
Идентификация диагностических сообщений в C++
Опция | Действие |
---|---|
-A | Разрешает только ключевые слова ANSI. |
-C- | Запрещает вложенные комментарии. |
-i32 | Устанавливает минимум 32 значащих символа в идентификаторах. |
-p- | Устанавливает использование соглашения о связях Си. |
-w- | Выключает все предупреждения, кроме следующего. |
-wbei | Включает предупреждение о несоответствии инициализаторов. |
-wbig | Включает предупреждение о слишком большой константе. |
-wcpt | Включает предупреждение о немобильных сравнениях указателей. |
-wdcl | Включает предупреждение об объявлениях без типа или класса памяти. |
-wdup | Включает предупреждение о дублирующихся неидентичных определениях макрокоманды. |
-wext | Включает предупреждение о переменных, определенных сразу как external и static. |
-wfdt | Включает предупреждение об определениях функции, использующих typedef |
-wrpt | Включает предупреждение о немобильных преобразованиях указателей. |
-wstu | Включает предупреждение о неопределенных структурах. |
-wsus | Включает предупреждение о подозрительном преобразовании указателя. |
-wvrt | Включает предупреждение о функции void, возвращающей значение. |
-wucp | Включает предупреждение о смешанном использовании указателей signed и unsigned char. |
Использование следующих параметров запрещено:
-ms! | Для моделей данных small SS и DS должны совпадать. |
-mm! | Для моделей данных small SS и DS должны совпадать. |
-mt! | Для моделей данных small SS и DS должны совпадать. |
-zGxx | Имя группы BSS не может быть изменено. |
-zSxx | Имя группы данных data не может быть изменено. |
Прочие параметры, не упомянутые здесь специально, могут устанавливаться по вашему желанию.
Семантика аргументов функции main
Когда программа выполняется в операционной системе DOS версий до 3.0, значение argv[0] представляет собой указатель на нулевой байт. Для версии DOS 3.0 и старше argv[0] указывает на имя программы.
Остальные строки argv указывают на каждый компонент аргументов командной строки DOS. Пробельные символы, разделяющие аргументы, удаляются, и каждая последовательность непрерывных непробельных символов рассматривается как отдельный аргумент. Строки символов в кавычках рассматриваются обычным способом (как одна строка, которая может содержать пробелы.)
Что считается интерактивным устройством Это любое устройства, работающее как консоль.
Схема упорядочения набора символов времени выполнения Схема упорядочения набора символов времени выполнения использует знаковое ASCII-значение символа.
Элементы наборов символов - исходного и этапа выполнения
Наборы символов, исходный и времени выполнения, представляют собой расширенный набор символов ASCII, поддерживаемый IBM PC. В строковых литералах, символьных константах или комментариях, может находиться любой символ, кроме ^Z (Control-Z).
Многобайтовые символы Многобайтовые символы в Borland C++ не поддерживаются.
Направление печати Печать символов происходит слева-направо, в нормальном для PC направлении.
Число бит в символе из набора воспринимаемых символов Символ из набора символов этапа выполнения имеет длину 8 бит.
Число значащих начальных символов идентификатора
Значащими являются только первые 32 символа, хотя это значение может быть изменено при помощи параметров командной строки (l). И внешние, и внутренние символические имена имеют одинаковое число значащих символов. (Число значащих символов в идентификаторах С++ не ограничено).
Учитывается ли регистр во внешних идентификаторах
Компилятор обычно заставляет компоновщик делать различие между заглавными и строчными буквами. Для того, чтобы подавить учет регистра, служит параметр командной строки (-l-c).
Представления и множества воспринимаемых значений для различных типов целых чисел
Тип | Минимальное значение | Максимальное значение |
---|---|---|
signed char | -128 | 127 |
unsigned char | 0 | 255 |
signed short | -32768 | 32767 |
unsigned short | 0 | 65535 |
signed int | -32768 | 32767 |
unsigned int | 0 | 65535 |
signed long | -2147483648 | 2147483647 |
unsigned long | 0 | 4294967295 |
Все типы char используют для хранения значения 8-битовый байт.
Все типы char используют 1 8-битовый байт памяти.
Все типы short и int используют 2 байта (в 16-разрядной программе).
Все типы short и int используют 4 байта (в 32-разрядной программе).
Все типы long используют 4 байта.
Если задано выравнивание в памяти (-a), все объекты целых типов, кроме char, выравниваются по границе четных байт. Если задан параметр -a4, результатом будет 4-байтовое выравнивание. Символьные типы не выравниваются никогда.
Представления и множества принимаемых значений для различных типов чисел с плавающей точкой
Для типов чисел с плавающей точкой Borland C++, допускаемых сопроцессором Intel 8087 используются форматы плавающей точки IEEE. Тип float использует 32-битовый формат действительных чисел IEEE. Тип double использует 64-битовый формат действительных чисел IEEE. Тип long double использует 80-битовый расширенный формат действительных чисел IEEE.
Соотношение между наборами символов - исходным и времени выполнения
Любые символы в строковых литералах или символьных константах остаются во время выполнения программы без изменений. Наборы символов, исходный и времени выполнения, одинаковы.
Текущее место действия, используемое для преобразования многобайтовых символов в соответствующие широкие символы для широкой символьной константы
Широкие символьные константы распознаются.
Значение целочисленной константы, которая содержит более одного символа, или широкая символьная константа, которая содержит более одного многобайтового символа
Символьные константы могут содержать 1 или 2 символа. В случае двух символов первый символ занимает младший байт константы, а второй - старший.
Результат преобразования целого в более короткий тип целого со знаком, либо результат преобразования целого без знака в целое со знаком равной длины, если значение не может быть представлено полностью
Эти преобразования выполняются простым усечением бит старшего порядка. Целые со знаком хранятся в виде дополнения до 2, поэтому результирующее число интерпретируется как таковое. Если старший бит более короткого целого ненулевой, то это значение интерпретируется как отрицательное. В противном случае оно считается положительным.
Направление усечения, когда число целого типа преобразуется в число с плавающей точкой, которое не может в точности представлять исходное число
Целое число округляется до ближайшего представимого значения. Например, значение типа long (2^32-1) преобразуется в значение float 2^31. Разрешение направления округления производится по стандартным арифметическим правилам IEEE.
Направление усечения или округления при преобразовании числа с плавающей точкой в число с плавающей точкой меньшей точности представления.
Число округляется до ближайшего представимого значения. Разрешение направления округления производится по стандартным арифметическим правилам IEEE.
Результаты поразрядных операций для целых со знаком
Поразрядные операции выполняются для целых со знаком так же, как и для соответствующих типов без знака. Знаковый бит рассматривается как обычный бит данных. Результат затем интерпретируется как обычное двоичное целое со знаком, представленное как дополнение.
Что происходит, когда доступ к элементу объекта типа объединения происходит при помощи элемента другого типа
Доступ разрешен и будет происходить к хранимым там битам. Для понимания доступа к элементу с плавающей точкой с использованием для этого компонента другого типа вы должны четко представлять себе битовую кодировку значений с плавающей точкой. Если хранимый элемент короче, чем элемент, используемый для доступа к значению, то лишние биты будут иметь значения, то они сохранят значения, которые они имели до записи в память более короткого элемента.
Тип целого числа, предназначенного для хранения максимального размера массива
Для обычного массива это тип unsigned int, а для массивов в случае модели данных huge это тип signed long.
Результат приведения типа указателя в целое и обратно
При преобразованиях между целыми и указателями одинаковых размеров ни один бит не изменяется. При преобразовании более длинного типа к более короткому усекаются старшие биты. При преобразовании более короткого целого в более длинный указатель сначала целое расширяется в такой целый тип, который по длине соответствует данному указателю. Целые со знаком для заполнения новых байтов расширяются по знаку. Аналогичным образом, более короткие указатели для преобразования в более длинный целый тип сначала расширяются до типа указателя, который по длине равен данному целому типу.
Знак остатка при целочисленном делении
Когда только один из операндов отрицателен, остаток также будет отрицательным. Если ни один из операндов не отрицателен, или оба отрицательны, остаток будет положительным.
Целый тип, необходимый для хранения разности между двумя указателями на элементы одного и того же массива, ptrdiff_t
Для ближних (near) указателей это тип signed int, а для указателей far или huge - это signed long. Тип ptrdiff_t зависит от используемой модели памяти. Для малых моделей памяти это тип int, а для больших моделей памяти - это тип long.
Результат сдвига вправо отрицательного целого типа со знаком
Отрицательные значения со знаком при сдвиге вправо расширяются по знаку.
Степень вероятности фактического размещения в регистрах объектов со спецификатором класса памяти register
В регистр могут быть помещены объекты, объявленные как двухбайтовые целые типы или указатели. Компилятор может помещать в регистр динамические локальные переменные малого размера, но объявленные как register будут иметь приоритет. Для этого бывает доступно не меньше двух, а вообще до шести регистров. Число фактически используемых для этой цели регистров зависит от числа регистров, необходимых для хранения промежуточных значений текущей функции.
Рассматривается ли линейное битовое поле int как signed int, или же как unsigned int
Линейные битовые поля int рассматриваются как имеющие тип signed int.
Порядок распределения битового поля в int
Битовое поле распределяется в направлении от позиции младшего бита к позиции старшего бита (младший бит - самый правый).
Заполнение и выравнивание компонентов структур
По умолчанию заполнение структур символами-заполнителями не выполняется. При использовании параметра выравнивания (-a) структуры дополняются до четного размера, а любые компоненты, не имеющие символьного типа или типа символьного массива, выравниваются по четным адресам смещения.
Может ли битовое поле пересекать границу блока памяти
Когда параметр выравнивания (-a) не запрашивается, битовое поле может пересекать границу слова, но никогда не может занимать более двух соседних байт.
Целый тип, которым представляются значения перечислимого типа
Если нумераторов столько, что хватает типа unsigned char, то выбирается этот тип; в противном случае выбирается signed int.
Доступ к объекту типа volatile
Любая ссылка к объекту volatile приводит к доступу к этому объекту. Приведет ли к доступу к объекту volatile доступ к смежным адресам памяти, зависит от конструктивной реализации памяти. В случае памяти специальных устройств, например памяти видеодисплея, это зависит от конструкции устройства. Для обычной памяти PC объекты volatile используются только при условии доступа по асинхронным прерываниям, так что доступ к соседним объектам не оказывает влияния.
Максимальное число описателей, которые могут модифицировать арифметический тип, структуру или объединение
Специальных ограничений на число описателей нет. Число разрешенных описателей достаточно велико, однако при глубоком уровне вложенности в набор блоков функции число описателей уменьшается. На файловом уровне это число не менее 50.
Максимальное число case-вариантов в операторе switch
На число вариантов оператора switch специальных ограничений нет. Если памяти достаточно, то компилятор обработает все.
Соответствует ли значение односимвольной константы в выражении типа константы, управляющем условным включением, значению той же символьной константы в наборе символов этапа выполнения; может ли такая символьная константа принимать отрицательное значение
Все символьные константы, даже константы условных директив, используют один и тот же набор символов (времени выполнения). Односимвольная константа будет отрицательной, если это символьный тип со знаком signed char (по умолчанию и при -K не запрашивается).
Метод поиска включаемых исходных файлов
В случае имен включаемых файлов, заданных в угловых скобках, если каталоги включаемых файлов указаны в командной строке, то поиск файлов производится в каждом из этих каталогов. Просмотр каталогов включаемых файлов происходит в следующем порядке. Сначала берутся каталоги, заданные в командной строке, а затем указанные в TURBOC.CFG или BCC32.CFG. Если каталоги включаемых файлов не заданы, то поиск выполняется только в текущем каталоге.
Поддержка задания в кавычках имен включаемых исходных файлов
Если имя файла задано в кавычках, то поиск файла будет выполняться в текущей директории. Если файл не найден, то далее Borland C++ будет выполнять поиск файла, как если бы его имя было задано в угловых скобках.
Особенности последовательности символов в именах файлов
Символы обратной наклонной черты в именах включаемых файлов рассматриваются как отдельные символы, а не как символы управляющей последовательности. Различия в регистре, в которым набрана та или иная буква, игнорируются.
Определения __DATE__ и __TIME__ , когда они недоступны
Дата и время доступны всегда и используют системные дату и время DOS.
Символ десятичной точки (для чисел с плавающей точкой).
Символом точки в десятичной записи чисел с плавающей точкой является '.'.
Тип оператора sizeof, size_t
Тип size_t - unsigned int.
Константа - пустой указатель, в которую расширяется макроопределение NULL
Для 16-разрядного приложения это int или long 0, в зависимости от модели памяти.
Для 32-разрядных приложений NULL расширяется в нулевое значение типа int или long (32-битовые числа со знаком).
Печатаемые диагностические сообщения и поведение при завершении функции assert
Печатается диагностическое сообщение "Assertion failed:выражение, file имя_файла, line nn", где выражение - это выражение с неудачно завершившейся функцией контроля особой ситуации, имя_файла - это имя исходного файла, а nn - это номер строки, где выполнялся контроль.
После вывода на дисплей данного диагностического сообщения вызывается функция abort.
Определяемые реализацией аспекты проверки символов и функции задания учета регистра
Отсутствуют, за исключением описанных в следующем пункте.
Наборы символов, проверяемые функциями isalnum, isalpha, iscntrl, islower, isprint и isupper
Первые 128 ASCII-символов а режиме по умолчанию или все 256 символов.
Значения, возвращаемые математическими функциями при ошибках, связанных с областью определения
IEEE NAN (не-число).
Устанавливают ли математические функции целочисленное выражение errno в значение макрокоманды ERANGE в случае ошибки потери значимости
Нет, только для других ошибок - области переполнения, сингулярности, переполнения и общей потери точности.
Происходит ли ошибка области определения, или возвращается ноль, когда функция fmod имеет второй аргумент, равный нулю
Нет. fmod(x, 0) возвращает 0.
Набор сигналов функции signal
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM.
Семантика каждого сигнала, распознаваемого функцией signal
См. описание функции signal в "Справочнике по библиотеке".
Обработка по умолчанию и обработка при загрузке программы каждого сигнала, распознаваемого функцией signal
См. описание функции signal в "Справочнике по библиотеке".
Блокирование сигнала, выполняемое если эквивалент signal (sig,SIG_DFL); не выполнен перед вызовом обработчика сигналов
Эквивалент signal(sig,SID_DFL) выполняется всегда.
Будет ли отменена обработка сигнала по умолчанию при получении сигнала SIGILL обработчиком, заданным функции signal
Всегда выполняется эквивалент signal(sig,SIG_DGF).
Требуется ли в последней строке текстового потока оконечный символ новой строки
Нет, не требуется.
Появляются ли при чтении символы пробела, записанные в текстовый поток непосредственно перед символом новой строки
Да, появляются.
Число нулевых символов, которые могут быть добавлены к данным, записываемым в двоичный поток
Не добавляются.
Устанавливается ли первоначально указатель позиции файла потока в режиме добавления (append) в начало или в конец файла
Указатель позиции файла для потока в режиме добавления первоначально помещается в начало файла. Перед каждой операцией записи он сбрасывается в конец файла.
Вызывает ли запись в текстовый поток усечение связанного с потоком файла за данной позицией
Запись 0 байт может привести, а может и не привести к усечению файла, в зависимости от буферизации файла. Безопаснее считать, что операция записи с нулевой длиной имеет непредсказуемое поведение.
Характеристики буферизации файла
Файл может иметь полную буферизацию, строчную буферизацию или не иметь таковой. Если файл буферизован, то перед открытием файла по умолчанию создается буфер с размером 512 байт.
Существуют ли физически файлы нулевой длины
Да, существуют.
Может ли один и тот же файл быть открыт неоднократно
Да, может.
Действие функции remove на открытый файл
Никакой специальной проверки, является ли файл открытым, не выполняется. Ответственность лежит на программисте.
Что произойдет, если файл с новым именем уже существовал перед вызовом rename
rename вернет значение -1, а errno будет установлена в значение EEXIST.
Вывод в случае преобразования %p в fprintf
В случае ближних моделей данных это четыре шестнадцатиричных цифры (XXXX). В случае дальних моделей данных это четыре шестнадцатиричных цифры, двоеточие и еще четыре шестнадцатиричных цифры (XXXX:XXXX). (Для 16-разрядных программ.)
Восемь шестнадцатиричных цифр (ХХХХХХХХ) (для 32-разрядных программ).
Ввод в случае преобразования %p в fscanf
См. в предыдущем пункте.
Интерпретация символа дефис (-), который не является ни первым, ни последним символом в списке сканирования в случае преобразования %[ в fscanf
См. описание fscanf в "Справочнике по библиотеке".
Значение, в которое устанавливается макрокоманда errno функциями fgetpos или ftell при неудачном завершении
Сообщения, генерируемые функцией perror
Сообщение | Сообщение |
---|---|
Error 0 Ошибка 0 | Invalid data
Неверные данные |
Invalid function number Неверный номер функции | No such device
Такого устройства нет |
No such file or directory Такого файла или каталоге нет | Attempt to remove current
directory
Попытка удалить текущий каталог |
Path not found Путь не найден | Not same device
Другое устройство |
Too many open files Слишком много открытых файлов | No more files
Файлов больше нет |
Permission denied Разрешение не дано | Invalid argument
Неверный аргумент |
Bad file number Неверный номер файла | Arg list too big
Список аргументов слишком велик |
Memory arena trashed Испорчена память | Exec format error
Ошибка формата запуска |
Not enough memory Недостаточно памяти | Cross-device link
Кросс-компоновка устройств |
Invalid memory block address Неверный адрес блока памяти | Math argument
Математический аргумент |
Invalid environment Неверная операционная среда | Result too large
Результат слишком велик |
Invalid format Неверный формат | File already exists
Файл уже существует |
Invalid access code Неверный код доступа |
Сообщение | Смысл |
---|---|
Bad address | Неверный адрес |
Block device required | Требуется блочное устройство |
Broken pipe | Нарушение конвейера |
Executable file in use | Выполняемый файл используется |
File too large | Файл слишком велик |
Illegal seek | Недопустимая установка |
Inapropriate I/O control operation | Неподходящая операция управле ния вводом-выводом |
Input/output error | Ошибка ввода-вывода |
Interrupted function call | Прерванный вызов функции |
Is a directory | Является каталогом |
Name too long | Слишком длинное имя |
No child processes | Нет дочерних процессов |
No space left in device | На устройстве не осталось места |
No such device or address | Нет такого адреса или устройства |
No such process | Нет такого процесса |
Not a directory | Не является каталогом |
Operation not permitted | Операция не разрешена |
Possible deadlock | Возможен клинч |
Read-only file system | Файловая система доступна только по чтению |
Resource busy | Ресурс занят |
Resource temporary | Ресурс временно недоступен unavailable |
Too manu links | Слишком много связей |
См. описание perror в "Справочнике по библиотеке".
Поведение calloc, malloc или realloc, если запрошен нулевой размер
calloc и malloc проигнорируют такой запрос и возвратят 0.
realloc освободит блок.
Поведение функции abort в отношении открытых и временных файлов
Буферы файлов не очищаются, а файлы не закрываются.
Статус, возвращаемый функцией exit при ненулевом значении аргумента, EXIT_SUCCESS или EXIT_FAILURE
Особые действия не предусмотрены. Статус возвращается в том виде, в котором он передан. Статус представлен как signed char.
Набор имен операционной среды и способ изменения значений переменных операционной среды при помощи getenv
Строки операционной среды те самые, что определяются командой SET. Для изменения этих строк на время выполнения текущей программы служит putenv, но для постоянного изменения их нужно использовать команду SET.
Содержимое и режим обработки строки функцией system
Строка интерпретируется как команда операционной системы. Используется COMSPEC или запускается COMMAND.COM (для 16-разрядных программ) или CMD.EXE (для 32-разрядных программ), и аргумент функции передается ему как команда на выполнение. Могут быть выполнены любые внутренние команды системы, а также файлы .BAT и .EXE.
Содержимое строк сообщений об ошибке, возвращаемых функцией strerror
Использование локального таймера и хранение времени в форме "AM/PM"
Определяются локальные время и данные PC.
Отсчет времени системными часами
Представлен тактами часов, а начало отсчета считается с момента запуска программы.
Форматы даты и времени
Borland C++ реализует форматы ANSI.
Назад | Содержание | Вперед