Реферат: Turbo C++ Programer`s guide
Например, функция f требует ссылку на int, а c имеет тип
char:
f(int&);
char c;
f(c);
Вместо вызова f с адресом c компилятор генерирует
код, эквивалентный следующему исходному коду С++:
int X = c, f(X);
Undefined
structure идентификатор
Неопределенная структура
идентификатор
Указанная структура была использована в исходном файле, возможно в
указателе на нее, но не была определена в исходном файле. Это предупреждение
может являться следствием опечатки в имени структуры или отсутствия объявления.
Unknown
assembler instruction
Неизвестная команда ассемблера
Компилятор встретил оператор встроенного
ассемблирования с недопустимым кодом операции. Проверьте написание кода
операции (в Главе 6, "Интерфейс с языком ассемблера" на стр. 271
оригинала). По умолчанию вывод этого сообщения отключен.
Unreachable
code
Недоступный код
За оператором break, continue, goto или return не следует метка или конец
цикла или функции. Компилятор отыскивает циклы while, do и for с условным
выражением типа константы и пытается распознать циклы, из которых не существует
условия выхода.
Untyped bit
field assumed signed int
Нетипизированному битовому полю
присвоен тип signed int
Данное битовое поле не имеет спецификации типа и ему присваивается тип
signed int. Некоторые компиляторы присваивают таким полям по умолчанию тип
signed int. Чтобы это предупреждение не выдавалось, вы должны сами присвоить
битовому полю тип int или unsigned int.
Void functions
may not return a value
Функции void не могут возвращать
значений
В исходном файле текущая функция объявлена с типом возврата void, а
компилятор встретил оператор return, в котором задано значение возврата. Это
значение игнорируется.
Приложение А Стандарты
ANSI, зависящие от реализации
Некоторые аспекты стандарта ANSI C не определяются ANSI достаточно
подробно. В таких случаях каждая реализация компилятора С может сама определять
отношение к этим аспектам. Данная глава говорит о том, как эти зависящие от
реализации стандарты определены фирмой Borland. Номера разделов соответствуют
здесь публикации стандарта ANSI от декабря 1988 года, которая является самой
новой. Отметим, что между С и С ++ имеются различия, а данное приложение
относится исключительно к С.
2.1.1.3 Как идентифицировать
диагностические сообщения
При запуске с правильной комбинацией опций любое
сообщение, выдаваемое компилятором и начинающееся словами Fatal, Error или
Warning, считается диагностическим в смысле, определяемом ANSI. Ниже приводятся
опции, необходимые для того, чтобы обеспечивалась данная интерпретация:
Идентификация
диагностических сообщений в TurboC++
Таблица A.1
Опция Действие
|
-A
-C-
-p-
i32
w-
wbei
wdcl
wcpt
wdup
wsus
wrpt
wvrt
wbig
wucp
wstu
wext
wfdt
|
Разрешает
только ключевые слова ANSI
Запрещает вложенные
комментарии
Устанавливает использование
соглашения о связях С
Устанавливает минимум 32
значащих символа в идентификаторах
Выключает все предупреждения,
кроме следующего
Включает предупреждение о
несоответствии инициализаторов
Включает предупреждение об объявлениях без типа или класса памяти
Включает предупреждение о немобильных сравнениях указателей
Включает предупреждение о дублирующихся не-идентичных определениях
макроса
Включает предупреждение о подозрительном преобразовании указателя
Включает предупреждение о немобильных преобразованиях указателей
Включает предупреждение о функции void, возвращающей значение
Включает предупреждение о
слишком большой константе
Включает предупреждение о
смешанном использовании указателей signed и unsigned char
Включает предупреждение о
неопределенных структурах
Включает предупреждение о переменных, определенных сразу как external и
static
Включает
предупреждение об определениях функции, использующих typedef
|
|
|
Использование следующих опций
запрещено: |
-ms! Для
моделей данных small SS и DS должны совпадать.
-mm! Для
моделей данных small SS и DS должны совпадать.
-mt! Для
моделей данных small SS и DS должны совпадать.
-zGxx Имя
группы BSS не может быть изменено.
-zSxx Имя группы данных data
не может быть изменено.
Прочие опции, не упомянутые здесь специально, могут устанавливаться по
вашему желанию.
2.1.2.2 Семантика аргументов,
передаваемых функции main
Когда программа выполняется в операционной системке DOS версий до 3.0,
значение argv[0] представляет собой указатель на нулевой байт. Для версии DOS
3.0 и старше argv[0] указывает на имя программы.
Остальные строки argv указывают на каждый компонент
аргументов командной строки DOS. Пробельные символы, разделяющие аргументы,
удаляются, и каждая последовательность непрерывных не-пробельных символов
рассматривается как отдельный аргумент. Строки символов в кавычках
рассматриваются обычным способом (как одна строка, которая может содержать
пробелы.)
2.1.2.3 Что считается
интерактивным устройством
Любое устройства, работающее как
консоль.
2.2.1Компоненты наборов символов - исходного и
времени выполнения
Наборы символов, исходный и времени выполнения,
представляют собой расширенный набор символов ASCII, поддерживаемый IBM PC.
Любой символ, кроме ^Z (Control-Z) может находиться в строковых литералах,
символьных константах или комментариях.
2.2.1.2 Состояния сдвига для
многобайтных символов
Многобайтные символы в Turbo C++
не поддерживаются.
2.2.2Направление печати
Печать символов происходит слева-направо, в
нормальном для PC направлении.
2.2.4.2 Число битов в символе из набора времени выполнения
Символ из набора символов времени выполнения имеет длину 8 битов.
3.1.2Число значащих начальных
символов идентификатора
Значащими являются только первые 32 символа, хотя
это значение может быть изменено при помощи опции командной строки (-l). И
внешние, и внутренние символические имена имеют одинаковое число значащих
символов. (Число значащих символов в идентификаторах С++ не ограничено).
3.1.2Учитывается ли регистр во
внешних идентификаторах
Компилятор обычно заставляет компоновщик делать
различие между заглавными и строчными буквами. Для того, чтобы подавить учет
регистра, служит опция командной строки (-l-c).
3.1.2.5 Представления и множества принимаемых значений для различных
интегральных типов
Тип Минимальное значение
Максимальное значение
signed char
-128 127
unsigned char 0 255
signed short -32,768
32,767
unsigned short 0
65,535
signed int -32,768
32,767
unsigned int 0
65,535
signed long -2,147,483,648
2,147,483,647
unsigned long 0
4,294,967,295
Все типы char используют для хранения значения
8-битовый байт.
Все типы short и int используют
2 байта.
Все типы long используют 4
байта.
Если задано выравнивание в памяти (-a), все объекты
интегральных типов, кроме char, выравниваются по границе четных байтов.
Символьные типы не выравниваются
никогда.
3.1.2.5 Представления и множества принимаемых
значений для различных типов чисел с плавающей точкой
Для типов с плавающей точкой Turbo C++ Intel 8087
использует форматы плавающей точки IEEE. Тип float использует 32-битовый формат
действительных чисел IEEE. Тип double использует 64-битовый формат действительных
чисел IEEE. Тип long double использует 80-битовый расширенный формат
действительных чисел IEEE.
3.1.3.4 Соотношение между наборами символов - исходным и
времени выполнения
Любые символы в строковых литералах или символьных
константах остаются во время выполнения программы без изменений. Наборы
символов, исходный и времени выполнения, одинаковы.
3.1.3.4 Значение целочисленной символьной константы,
содержащей символ или управляющую последовательность, не представленные в
базовом наборе символов времени выполнения или в расширенном наборе символов,
для широкой символьной константы
Широкие символы не поддерживаются. Они рассматриваются как
обычные символы. Все допустимые управляющие последовательности помещаются в
один или другой символ. Если используется шестнадцатиричная или восьмеричная
управляющая последовательность, превышающая допустимый для символа диапазон,
компилятор выдает сообщение.
3.1.3.4 Значение целочисленной константы, которая содержит
более одного символа, или широкая символьная константа, которая содержит более
одного многобайтного символа
Символьные константы могут содержать один или два символа.
Если включено два символа, то первый символ занимает младший байт константы, а
второй занимает старший байт.
3.1.3.4 Текущее место действия, используемое для
преобразования многобайтных символов в соответствующие широкие символы для
широкой символьной константы
Широкие символьные константы распознаются, но
рассматриваются, как обычные символьные константы. В этом смысле "местом
действия" является "С".
3.2.1.2 Результат преобразования целого в более короткий
тип целого со знаком, либо результат преобразования целого без знака в целое со
знаком равной длины, если значение не может быть представлено полностью
Эти преобразования выполняются простым усечением битов
старшего порядка. Целые со знаком хранятся в виде дополнения до 2, поэтому
результирующее число интерпретируется как таковое. Если старший бит более
короткого целого ненулевой, то это значение интерпретируется как отрицательное;
в противном случае оно считается положительным.
3.2.1.3 Направление усечения, когда число интегрального
типа преобразуется в число с плавающей точкой, которое не может в точности
представлять исходное число
Целое число округляется до ближайшего представимого значения.
31-1
Например, значение типа long (2 ) преобразуется в
значение float 31
2 . Разрешение направления округления производится
по стандартным арифметическим правилам IEEE.
3.2.1.4 Направление усечения или округления при
преобразовании число с плавающей точкой в число с плавающей точкой меньшей
точности представления.
Число округляется до ближайшего представимого значения.
Разрешение направления округления производится по стандартным арифметическим
правилам IEEE.
3.3 Результаты поразрядных
операций для целых со знаком
Поразрядные операции выполняются для целых со
знаком так же, как и для соответствующих типов без знака. Знаковый бит
рассматривается как обычный бит данных. Результат затем интерпретируется как
обычное целое со знаком, представленное как дополнение до 2.
3.3.2.3 Что происходит, когда доступ к компоненту объекта
типа объединения происходит при помощи компонента другого типа
Доступ разрешен и будет происходить к хранимым там битам.
Для понимания доступа к компоненту с плавающей точкой с использованием для
этого компонента другого типа вы должны четко представлять себе битовую
кодировку значений с плавающей точкой. Если хранимый компонент короче, чем
компонент, используемый для доступа к значению, то лишние биты будут иметь
значения, то они сохранят значения, которые они имели до записи в память более
короткого компонента.
3.3.3.4 Тип целого числа, предназначенного для хранения максимального
размера массива
Для обычного массива это тип unsigned int, а для массивов в случае модели
данных huge это тип signed long.
3.3.4Результат
приведения типа указателя в целое и обратно
При преобразованиях между целыми и указателями
одинаковых размеров ни один бит не изменяется. При преобразовании более
длинного типа к более короткому усекаются старшие биты. При преобразовании
более короткого целого в более длинный указатель сначала целое расширяется в
такой интегральный тип, который по длине соответствует данному указателю. Целые
со знаком для заполнения новых байтов расширяются по знаку. Аналогичным
образом, более короткие указатели для преобразования в более длинный
интегральный тип сначала расширяются до типа указателя, который по длине равен
данному интегральному типу.
3.3.5Знак остатка при
целочисленном делении
Когда только один из операндов отрицателен, остаток
также будет отрицательным. Если ни один из операндов не отрицателен, или оба
отрицательны, остаток будет положительным.
3.3.6Интегральный тип, необходимый для хранения разности
между двумя указателями на элементы одного и того же массива, ptrdiff_t
Для ближних (near) указателей это тип signed int, а для указателей far
или huge - это signed long. Тип ptrdiff_t зависит от используемой модели
памяти. Для малых моделей памяти это тип int, а для больших моделей памяти -
это тип long.
3.3.7Результат сдвига вправо отрицательного интегрального
типа со знаком
Отрицательные отрицательные значения со знаком при сдвиге
вправо расширяются по знаку.
3.5.1Степень вероятности фактического размещения в
регистрах объектов со спецификатором класса памяти register
В регистр могут быть помещены объекты, объявленные как
двухбайтовые интегральные типы или указатели. Компилятор может помещать в
регистр динамические локальные переменные малого размера, но объявленные как
register будут иметь приоритет. Для этого бывает доступно не меньше двух, а
вообще до шести регистров. Число фактически используемых для этой цели
регистров зависит от числа регистров, необходимых для хранения промежуточных
значений текущей функции.
3.5.2.1 Заполнение и
выравнивание компонентов структур
По умолчанию заполнение
структурсимволами-заполнителями не выполняется. При использовании опции
выравнивания (-a) структуры дополняются до четного размера, а любые
компоненты,не имеющие символьного типа или типа символьного массива,
выравниваются по четным адресам смещения.
3.5.2.1 Рассматривается ли линейное битовое поле int как
signed int, или же как unsigned int
Линейные битовые поля int рассматриваются как имеющие тип
signed int.
3.5.2.1 Порядок распределения
битового поля в int
Битовое поле распределяется в направлении от
позиции младшего бита к позиции старшего бита.
3.5.2.1 Может ли битовое поле пересекать границу единицы памяти
Когда опция выравнивания (-a) не запрашивается, битовое поле может
пересекать границу слова, но никогда не может занимать более двух соседних
байтов.
3.5.2.2 Интегральный тип, которым представляются значения перечислимого
типа
Если нумераторов столько, что хватает типа unsigned char,
то выбирается этот тип; в противном случае выбирается signed int.
3.5.4Максимальное число деклараторов, которые могут модифицировать
арифметический тип, структуру или объединение
Специальных ограничений на число деклараторов нет. Число
разрешенных деклараторов достаточно велико, однако при глубоком уровне
вложенности в набор блоков функции число деклараторов уменьшается. На файловом
уровне это число не менее 50.
3.5.5.3 Что представляет собой доступ к объекту, который
квалифицирован типом volatile
Любая ссылка на объект volatile приводит к доступу к
самому объекту. Произойдет ли доступ к объекту при доступе к смежным адресам
памяти, зависит от физической конструкции памяти в аппаратном обеспечении. Для
специальной памяти устройств, такой как дисплейная память, это зависит от
конструкции устройства. Для обычной памяти PC объекты volatile используются
только для такой памяти, к которой возможен доступ по асинхронным прерываниям,
поэтому доступ к смежным объектам не оказывает эффекта.
3.6.4.2 Максимальное число case-вариантов в операторе
switch
На число вариантов оператора switch специальных ограничений нет. Если
памяти достаточно, то компилятор обработает все.
3.8.1Соответствует ли значение одно-символьной константы в
выражении типа константы, управляющем условным включением, значению той же
символьной константы в наборе символов времени выполнения. Может ли такая символьная
константа принимать отрицательное значение
Все символьные константы, даже константы условных
директив, используют один и тот же набор символов (времени выполнения).
Одно-символьная константа будет отрицательной, если это символьный тип со
знаком signed char (по умолчанию и при -K не запрашивается).
3.8.2Метод нахождения включаемых
исходных файлов
В случае имен включаемых файлов, заданных в угловых
скобках, если включаемые директории указаны в командной строке, то поиск файлов
производится в каждой из этих директорий. Просмотр включаемых директорий
происходит в следующем порядке. Сначала берутся директории, заданные в
командной строке, а затем указанные в TURBOC.CFG. Если включаемые директории не
заданы, то поиск выполняется только в текущей директории.
3.8.2Поддержка задания в кавычках имен включаемых исходных
файлов
Если имя файла задано в кавычках, то поиск файла будет
выполняться в текущей директории. Если файл не найден, то далее Turbo C++ будет
выполнять поиск файла, как если бы его имя было задано в угловых скобках.
3.8.2Особенности последовательности символов в именах
файлов
Символы обратной наклонной черты в именах включаемых
файлов рассматриваются как отдельные символы, а не как символы управляющей
последовательности. Различия в регистре, в которым набран та или иная буква,
игнорируются.
3.8.8Определения
__DATE__ и __TIME__ , когда они недоступны
Дата и время доступны всегда и используют системные дату и время DOS.
4.1.1Тип операции sizeof, size_t
Тип size_t - unsigned int.
4.1.1Символ, отображающий
десятичную точку
Это точка (.).
4.1.5Константа - пустой указатель, в которую расширяется макрос NULL
Int
или long 0, в зависимости от модели памяти.
4.2 Печатаемые диагностические сообщения и
поведение при завершении функции assert
Печатается диагностическое сообщение "Assertion
failed: выражение, file имя_файла, line nn", где выражение - это выражение
с неудачно завершившейся функцией контроля особой ситуации, имя_файла - это имя
исходного файла, а nn - это номер строки, где выполнялся контроль.
После вывода на дисплей данного диагностического сообщения
вызывается функция abort.
4.3 Определяемые реализацией аспекты проверки символов и
функции задания учета регистра
Отсутствуют,
за исключением описанных в п.4.3.1.
4.3.1Наборы символов, проверяемые функциями
isalnum, isalpha, iscntrl, islower, isprint и isupper
Первые 128 ASCII-символов.
4.5.1Значения, возвращаемые математическими
функциями при ошибках, связанных с областью определения
IEEE NAN (не-число).
4.5.1Устанавливают ли математические функции
целочисленное выражение errno в значение макроса ERANGE в случае ошибки
отрицательного переполнения
Нет, только для других ошибок - области переполнения,
сингулярности, переполнения и общей потери точности.
4.5.6.4 Происходит ли ошибка области определения, или
возвращается ноль, когда функция fmod имеет второй аргумент, равный нулю
Нет. fmod(x, 0) возвращает 0.
4.7.1.1 Набор сигналов функции
signal
SIGABRT, SIGFPE, SIGILL, SIGINT,
SIGSEGV, SIGTERM.
4.7.1.1 Семантика каждого сигнала, распознаваемого
функцией
См. описание функции signal в
Справочнике по библиотеке.
4.7.1.1 Обработка по умолчанию и обработка при загрузке программы каждого
сигнала, распознаваемого функцией signal
См. описание функции signal в
Справочнике по библиотеке.
4.7.1.1 Блокирование сигнала, выполняемое если
эквивалент signal(sig,SIG_DFL);не выполнен перед вызовом обработчика сигналов
Эквивалент signal(sig,SID_DFL)
выполняется всегда.
4.7.1.1 Будет ли отменена обработка сигнала по
умолчанию при получении сигнала SIGILL обработчиком, заданным функции signal
Нет.
4.9.2Требуется ли в последней строке текстового
потока оконечный символ новой строки
Нет, не требуется.
4.9.2Появляются ли при чтении символы пробела,
записанные в текстовый поток непосредственно перед символом новой строки
Да, появляются.
4.9.2Число нулевых символов, которые могут быть
добавлены к данным, записываемым в двоичный поток
Не добавляются.
4.9.3Устанавливается ли первоначально указатель позиции файла потока в
режиме добавления (append) в начало или в конец файла
Указатель позиции файла для потока в режиме добавления
первоначально помещается в начало файла. Перед каждой операцией записи он
сбрасывается в конец файла.
4.9.3Вызывает ли запись в текстовый поток усечение связанного с потоком
файла за данной позицией
Запись 0 байтов может привести, а может и не привести к
усечению файла, в зависимости от буферизации файла. Если файл буферизован, то
перед открытием файла по умолчанию создается буфер с размером 512 байт.
4.9.3Существуют ли физически
файлы нулевой длины
Да, существуют.
4.9.3Может ли один и тот же файл быть открыт
неоднократно
Да, может.
4.9.4.1 Действие функции remove
на открытый файл
Никакой специальной проверки, является ли файл
открытым, не выполняется. Ответственность лежит на программисте.
4.9.4.2 Что произойдет, если файл с новым именем
уже существовал перед вызовом rename
rename вернет значение -1, а errno будет установлена в
значение EEXIST.
4.9.6.1 Вывод в случае
преобразования %p в printf
В случае ближних моделей данных это четыре
шестнадцатиричных цифры (XXXX). В случае дальних моделей данных это четыре
шестнадцатиричных цифры, двоеточие и еще четыре шестнадцатиричных цифры
(XXXX:XXXX).
4.9.6.2 Ввод в случае
преобразования %p в fscanf
См. 4.9.6.1.
4.9.6.2 Интерпретация символа дефис (-), который не
является ни первым, ни последнимсимволом в списке сканирования в случае
преобразования %[ в fscanf
См.
описание fscanf в Справочнике по библиотеке.
4.9.9.1 Значение, в которое устанавливается макрос
errno функциями fgetpos или ftell при неудачном завершении
EBADF - Неверный номер файла.
4.9.10.4 Сообщения, генерируемые
perror
-----------------------------------------------------------
Error 0
Invalid data
Ошибка 0 Неверные данные
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
Неверный код доступа
См.
описание perror в Справочнике по библиотеке.
4.10.3 Поведение calloc, malloc или realloc, если запрошен нулевой размер
calloc и malloc проигнорируют такой запрос. realloc освободит блок.
4.10.4.1 Поведение функции abort в отношении открытых и временных файлов
Буферы файлов не очищаются, а
файлы не закрываются.
4.10.4.3 Статус, возвращаемый exit при ненулевом значении аргумента,
EXIT_SUCCESS или EXIT_FAILURE
Особенные действия не предусмотрены. Статус возвращается в
том виде, в котором он передан. Статус представлен как signed char.
4.10.4.4 Набор имен операционной среды и способ изменения значений переменных
операционной среды при помощи getenv
Строки операционной среды те самые, что определяются
командой DOS SET. Для изменения этих строк на время выполнения текущей
программы служит putenv, но для постоянного изменения их нужно использовать
команду DOS SET.
4.10.4.5 Содержимое и режим обработки строки функцией
system
Строка интерпретируется как команда DOS. Запускается
COMMAND.COM, и аргумент функции передается ему как команда на выполнение. Могут
быть выполнены любые внутренние команды DOS, а также .BAT-файлы и
.EXE-программы.
4.11.4.4 Последовательность сравнения набора символов
времени выполнения
Последовательность сравнения набора символов времени
выполнения использует значение символа signed char ASCII.
4.11.6.2 Содержимое строк сообщений об ошибке,
возвращаемых strerror
См. 4.9.10.4.
4.12.1 Использование локального таймера и хранение времени в форме
"AM/PM"
Определяются локальные время и
данные PC.
4.12.2.1 Отсчет времени
системными часами
Представлен тактами часов, а начало отсчета считается с момента запуска
программы.
4.12.3.5 Форматы даты и времени
Turbo C++
реализует форматы ANSI.
_
|