46019 (665326), страница 40
Текст из файла (страница 40)
a: /* это метка команды C goto "a" */
...
asm jmp a /* переход к метке"a" */
...
*)
Также допустимы косвенные переходы. Для того, чтобы выполнить косвенный переход, в качестве операнда команды перехода указывается имя регистра.
Функции прерывания
8086 резервирует первые 1024 байта памяти для набора из 256 дальних указателей, называемых также векторамипрерывания, указывающих на специальные системные подпрограммы, которые называются обработчиками прерываний. Эти подпрограммы вызываются при выполнении следующей команды:
int int#
где int# это число от 0h до FFh. Когда встречается данная команда, компьютер сохраняет кодовый сегмент (CS), указатель команд (IP) и состояния флагов, затем запрещает прерывания и выполняет дальний переход по адресу, на который указывает соответствующий вектор прерывания. Например, часто встречается прерывание
int 21h
вызывающее большинство подпрограмм DOS. Однако, многие векторы прерывание не использованы, что означает для вас возможность написать собственные обработчики прерываний и поместить дальние указатели на них в свободные векторы прерывания.
Для того, чтобы написать в Turbo C++ обработчик прерывания, вы должны определить функцию с типом interrupt; более конкретно, она может выглядеть следующим образом:
void interrupt myhandler(bp, di, si, ds, es, dx,
cx, bx, ax, ip, cs, flags, ...);
Как можно заметить, все регистры передаютсяв качестве параметров, что позволяет использовать и модифицировать их в вашей программе, не прибегая к рассмотренным выше в данной главе псевдопеременным. Допускается также передачаобработчику прерываний дополнительных параметров (flags,...); последние должны иметь соответствующие определения.
Функция типа interrupt автоматически сохраняет (помимо SI, DI и BP) регистры от AX до DX и DS. Эти же регистры при выходе из обработчика прерывания восстанавливаются.
Обработчики прерываниймогут использовать арифметические операции с плавающей точкой при всех моделяхпамяти. Любойкод обработчика прерывания, использующий 80х87, должен сохранять состояние сопроцессора при входе и восстанавливать его при выходе.
Функция прерывания может модифицировать передаваемые ей параметры. Изменение объявленных параметров приведет к модификации соответствующего регистра при выходе из обработчика прерывания. Это свойство может оказаться полезным, когда обработчик прерывания используется как служебнаяфункция пользователя, какэто происходит вслучаеслужебной функции DOS INT
21. Кроме того, обратите внимание на то, что функция прерывания выполняет выход с помощью команды IRET (возврата из прерывания).
Итак, в каких случаях может понадобиться написать собственный обработчик прерываний? Делов том, что так работает большинство резидентных программ. Они инсталлируются какобработчики прерываний. Тем самым, при выполнении некоторого периодического или специального действия (тактовом сигнале часов, нажатии клавиши и т.д.) происходит обращение к соответствующемуобработчику прерывания и соответствующие действия. Затем управление возвращается программе, при выполнении которой встретилось данное прерывание.
Практические примеры программ низкого уровня
Мы уже рассмотрели несколько примеров обращений к функциям низкого уровня из С-программы; рассмотрим еще несколько таких практических примеров. Начнем с обработчика прерывания, который выполняет некоторые безвредные, но ощутимые (в данном случае слышимые) действия: при его вызове раздается звуковой сигнал.
Прежде всего, напишем саму функцию: Она может выглядеть следующим образом:
#include
void interrupt mybeep(unsigned bp, unsigned di, unsigned si, unsigned ds, unsigned es, unsigned dx, unsigned cx, unsigned bx, unsigned ax)
(*
int i, j;
char originalbits, bits;
unsigned char bcount = ax >> 8;
/* прием текущих установок управляющего порта */
bits = originalbits = inportb(0x61);
for (i = 0; i <= bcount; i++) (
/* временное выключение динамика */
outportb(0x61, bits & 0xfc);
for (j = 0; j <= 100; j++)
; /* пустой оператор */
/* теперь динамик на некоторое время включается */
outportb(0x61, bits \! 2);
for (j = 0; j <= 100; j++)
; /* еще один пустой оператор */
)
/* восстановление установок управляющего порта */
outportb(0x61, originalbits);
*)
Затем напишем функцию, которая будет инсталлировать данный обработчик прерываний. Ей передается адрес и номер обработчика (от 0 до 255 или от 0x00 до 0xFF).
void install(void interrupt (*faddr)(), int inum)
(*
setvect(inum, faddr);
*)
И наконец, вызовем для проверки написанную вами сигналящую подпрограмму. Это сделает следующая функция:
void testbeep(unsigned char bcount, int inum)
(*
_AH = bcount;
geninterrupt(inum);
*)
Функция main может иметь вид:
main()
(*
char ch;
install(mybeep,10);
testbeep(3,10);
ch = getch();
*)
Вы можете также сохранить исходный вектор прерывания и восстановить его при выходе из главной программы. Для этого служат функции getvect и setvect.
Глава 7Сообщения об ошибках
Turbo C++ различает две категории ошибок: времени выполнения и времени компиляции. Сообщения об ошибках времени выполнения выдаются непосредственно при их обнаружении. Сообщения об ошибках времени компиляции делятся на три категории: фатальные ошибки, не-фатальные ошибки и предупреждения. Более подробно они описаны, начиная со стр.283 оригинала.
Следующие обобщенные имена и значения используются в перечисленных в данной главе сообщениях (большинство из них понятны и так и в разъяснениях не нуждается). В фактических сообщениях об ошибках вместо обобщенных имен и значений подставляются конкретные.
------------------------------------------------------------
Обобщенное имя Фактическое имя или значение в данном руководствевыводимое на экран
------------------------------------------------------------ аргументАргумент командной строки или иной аргумент классИмя класса
полеСсылка на поле
имя_файлаИмя файла (с расширением или без)
группа Имя группы
идентификаторИдентификатор (имя переменной или другой) языкНазвание языка программирования компонентИмя компонента данных или функции компонента сообщениеСтрока сообщения
модуль Имя модуля
числоФактическое число
опцияОпция командной строки или другая опция параметрИмя параметры
сегментИмя сегмента
спецификаторСпецификатор типа символическое_имяСимволическое имя XXXXh4-значное шестнадцатиричное число,
за которым следует h
Сообщения об ошибках перечислены в алфавитном порядке, по старшинству символов ASCII; обычно первыми идут сообщения, начинающиеся символами (равенство, запятая, фигурная скобка и т.д.). Поскольку сообщения, в которых на первом месте выводится имя, специфическое для данной программы, не могут быть расставлены по алфавиту, то они также находятся в начальной части каждого списка сообщений.
Например, если у вас имеется функция С++ goforit, то фактически вы можете получить сообщение об ошибке
goforit must be declared with no arguments
Для того, чтобы найти описание данного сообщения в этой главе, искать следует сообщение
функция must be declared with no arguments
в начале списка сообщений об ошибках.
Если же некоторая переменная включается в текст сообщения позже (например, "Incorrect command-line argument: аргумент"), то такое сообщение можно найти по алфавиту, в данном случае на букву I.
Сообщения об ошибках времени выполнения
Количество ошибок времени выполнения в Turbo C++ невелико. Эти ошибки могут быть обнаружены в уже откомпилированной и выполняющейся программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями.
Эти ошибки могут являться следствием случайного затирание памяти программой.
Abnormal program termination
Аварийное завершение программы
Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце раздела, касающегося ошибок операций с плавающей точкой. Вызов abort также приводит к появлению данного сообщения.
Divide by 0
Деление на ноль
Данное сообщение выдается при целочисленном делении на ноль, например
int n = 0;
n = 2 / n;
Эту ошибку можно отследить при помощи функции signal. В противном случае вызывается abort, и программа завершается.
Floating point error:Divide by 0.
Ошибка операции с плавающей точкой:Деление на 0.
Floating point error:Domain.
Ошибка операции с плавающей точкой:Выход из области определения.
Floating point error:Overflow.
Ошибка операции с плавающей точкой:Переполнение.
Данные фатальные ошибки являются следствием операции с плавающей точкой, для которой результат не определен.
- "Деление на 0" означает, что результат равен в точности +INF или -INF (плюс или минус неопределенность), например для операции 1.0/0.0.
- "Выход из области определения" означает, что результат равен NAN (not a number - не число), например для
0.0/0.0.
- "Переполнение" означает, что результат равен +INF (неопределенность) или -INF при полной потере точности, например в случае присвоения 1e20*1e20 переменной типа double.
Floating point error:Partial loss of precision.
Ошибка операции с плавающей точкой:Частичная потеря точности.
Floating point error:Underflow.
Ошибка операции с плавающей точкой:Отрицательное переполнение.
Эти особые ситуации по умолчанию маскируются, и сообщения об ошибках не выдаются. Отрицательное переполнение преобразуется в ноль,а потери точности игнорируются. Отменить маску можно, вызвав _control87.
Floating polnt error:Stack fault.
Ошибка операции с плавающей точкой:Сбой в стеке.
Это сообщение указывает на выход за пределы стека плавающей точки. В нормальных условиях оно не появляется и поэтому может означать либо то, что ассемблерный код использует слишком много регистров, либо неправильное объявление функции с плавающей точкой.
Этой ошибки можно избежать, маскируя особые ситуации таким образом, чтобы они не появлялись, либо перехватывая их функцией signal. См. подробное описание функций _control87 и signal в Справочнике по библиотеке.
В каждом из приведенных случаев программа печатает сообщение об ошибке и затем вызывает abort, которая в свою очередь выдает сообщение
Abnormal program termination
и вызывает _exit(3). См. подробные описания функций abort и _exit.
Null pointer assignment.
Присвоение пустому указателю
При выходе из программы с моделью памяти small или medium выполняется проверка, чтобы определить, были ли изменены значения двух первых байтов в сегменте данных программы. Эти байты никогда не должны изменяться работающей программой. Если же они были изменены, то выдается сообщение "Null pointer asignment", говорящее о том, что (вероятно) некоторое значение было записано в неинициализированный указатель. Во всех прочих отношениях программа может работать правильно; однако данная ошибка является серьезной ошибкой, и ей следует заняться немедленно. Если вы не сможете исправить неинициализированный указатель, это приведет к непредсказуемому поведению компьютера (вплоть до его "блокирования" в случае моделей памяти large, compact и huge.) Для отслеживания таких ошибок может служить интегрированный отладчик, входящий в среду разработки.
Stack overflow
Переполнение стека
По умолчанию размер стека для программ Turbo C++ равен 4,096 байт. Для большинства программ этого достаточно, однако программы с рекурсивными функциями или большими объемами локальных данных могут переполнить стек. Данное сообщение выдается только в том случае, когда включено средство контроля стека. При получении этого сообщения вы можете перейти к большей модели памяти, увеличить размер стека, либо уменьшить использование стека вашей программой. Информацию о том, как изменить размер стека с помощью глобальной переменной _stklen, см. в Главе 2, "Глобальные переменные" в Справочнике по библиотеке. Для уменьшения количества используемых функцией локальных данных можно поступить так, как показано в приводимом ниже примере. Переменная buffer объявлена как static и потому, в отличие от list, не расходует стек.
void anyfunction( void )
(*
static int buffer[ 2000 ];/*размещается в сегменте данных*/
int list[ 2000 ]; /*размещается в стеке*/
*)
Объявление локальных переменных как static имеет два недостатка.
1. Теперь такая переменная занимает место, отводимое обычно глобальным переменным и куче. (Чтобы заплатить Павлу, приходится грабить Петра). Однако этот недостаток не самый главный.
2. Функция не может более являться реентерабельной. Это означает, что если функция должна вызываться рекурсивно или асинхронно, и при этом важно, чтобы каждый вызов функции работал со своей собственной копией переменной, то такая переменная не может являться статической. Это связано с тем, что при каждом вызове функции данная переменная будет занимать ту же самую область памяти, вместо того, чтобы ей распределялась всякий раз новая. Также возникает проблема с разделением доступа к переменной, если функция содержит вызов самой себя (рекурсивно), либо должна выполняться одновременно сама с собой (асинхронно). Для большинства программ DOS это не проблема. Если вы не пишете рекурсивных функций и не работаете в мультизадачном режиме, то вам не о чем беспокоиться. В противном случае приведенные выше объяснения помогут вам разобраться, что к чему.
Сообщения об ошибках компилятора
Диагностические сообщения компилятора Turbo C++ делятся на три категории: фатальные ошибки, ошибки и предупреждения.
Фатальные ошибки встречаются редко. Некоторые из них обозначают внутреннюю ошибку компилятора. В случае фатальной ошибки компиляция немедленно прекращается. Далее вы должны предпринять соответствующие действия и затем повторить компиляцию.
Ошибки обозначают синтаксические ошибки программы, ошибки доступа к диску или к памяти, а также ошибки командной строки. Компилятор закончит текущую фазу компиляции и остановится. На каждой фазе (препроцессор, лексический анализ, оптимизация и генерация кода) компилятор пытается найти столько фактических ошибок, сколько возможно.
Предупреждения не приводят к остановке работы компилятора. Они лишь указывают на ситуации, которые кажутся компилятору подозрительными, но являются допустимыми с точки зрения языка. Компилятор также выдает предупреждения о наличии в исходных файлах машино-зависимых конструкций.
В сообщении компилятор сначала указывает класс этого сообщения, затем имя исходного файла, далее номер строки, в которой обнаружена ошибка, и наконец, собственно текст сообщения об ошибке.
В приводимых ниже перечнях сообщения об ошибках представлены по классам в алфавитном порядке. Для каждого сообщения приводится возможная причина его появления и рекомендации по устранению ошибки.
Вы должны знать о номерах строк в сообщениях следующее: компилятор генерирует сообщения об ошибках по мере их обнаружения. Поскольку С никак не регламентирует размещение операторов по строкам текста, истинная причина ошибки может находиться несколькими строками выше, чем указанная в сообщении строка. В следующих перечнях сообщений мы отметили те из них, которые часто на самом деле находятся выше, нежели строка, указанная компилятором.
Фатальные ошибки
Bad call of inline function
Неправильный вызов встроенной функции
Вы вызвали встроенную функцию из макро определения, но сделали это неправильно. Встроенная функция в С должна начинаться двумя символами подчеркивания (__).
Irreducible expression tree
Неупрощаемое дерево выражения
Это сообщение указывает на некоторую ошибку компилятора. Выражение в указанной строке исходного файла вызвало условие, когда генератор кода не может выполнить свою работу. Как бы это выражение ни было необходимым, его следует переписать. В случае, если вы получите такое сообщение, уведомьте об этом Borland.
Out of memory
Недостаточно памяти
Исчерпана общая рабочая память. Повторите компиляцию этого файла на машине с большей доступной памятью. Если у вас и так имеется 640К, следует упростить исходный файл.
Register allocation error
Ошибка распределения регистров
Это сообщение указывает на некоторую ошибку компилятора. Выражение в указанной строке исходного файла оказалось настолько сложным, что генератор кода не смог выполнить свою работу. Упростите это выражение. Если это не помогло, постарайтесь обойтись без него. В случае, если вы получите такое сообщение, уведомьте об этом Borland.
Ошибки
конструктор cannot return a value
конструктор не может возвращать значение
Конструктор С++ не может иметь выражения в операторе возврата.
конструктор is not a base class of класс
конструктор не относится к базовому классу класс
Конструктор класса С++ "класс" пытается вызвать конструктор базового класса "конструктор", либо вы пытаетесь изменить права доступа класс::конструктор. Конструктор не относится к базовому классу "класс". Проверьте объявления.
функция1 cannot be distingulshed from функция2
функция1 не отличается от функции2
Списки типов параметров в объявлениях этих двух функций недостаточно отличаются, чтобы эти функции отличались друг от друга. Попытайтесь изменить в объявлении одной из них последовательность или тип параметров.
функция is ambiguous
функция неоднозначна
Данному вызову "функции" соответствует по списку аргументов более одной перегруженной функции (с учетом преобразования аргументов по умолчанию). Используйте явное приведение типов одного или более аргументов для разрешения этой неоднозначности.
функция must be declared with no arguments
функция должна быть объявлена без аргументов
Данная функция-операция С++ была неправильно объявлена с аргументами.
функция must be declared with one argument
функция должна быть объявлена с одним аргументом
Данная функция-операция С++ была неправильно объявлена с более чем одним аргументом
функция must be declared with two arguments
функция должна быть объявлена с двумя аргументами
Данная функция-операция С++ была неправильно объявлена с числом аргументов, отличным от двух.
функция was previously declared without static
функция была ранее объявлена без атрибута static
Здесь функция объявлена как static, тогда как выше она была объявлена как extern (или global). ANSI C не позволяет смешивать эти объявления.
функция was previously declared with the language язык
функция была выше объявлена с модификатором языка "язык"
Функция может иметь только один модификатор языка (cdecl, pascal или interrupt). Данная функция в двух местах была объявлена с двумя разными модификаторами языка.
идентификатор cannot be declared in an anonymous union
идентификатор не может быть объявлен в анонимном объединении
Компилятор обнаружил объявление функции компонентаили статического компонента в анонимном объединении. Такие объединения могут содержать только компоненты данные.
идентификатор cannot be used in a static member function
идентификатор не может использоваться в статической функциикомпоненте
Статическая функция-компонент может использовать только статические компоненты своего класса, хотя и имеет полные права доступа. Данная ошибка является результатом попытки использования компонента, для которого требуется указатель this.
идентификатор is inaccessible because also in класс
идентификатор недоступен поскольку также используется в классе
Недопустимо использовать класс в качестве и прямого, и косвенного базового класса, поскольку поля его автоматически становятся неоднозначными. Попытайтесь сделать базовый класс виртуальным в обоих местах.
идентификатор is not a data member and can't be initlallzed here
идентификатор не является компонентом данных и не может быть здесь инициализирован
В инициализаторах конструктора допускается инициализация только компонентов данных. Это сообщение означает,что список включает в себя статический компонент или функцию-компонент.
идентификатор is not a member of struct
идентификатор не является компонентом структуры
Вы пытаетесь сослатьсяна идентификатор, как на компонент структуры, в то время как он не является компонентом структуры.
Проверьте объявления.
идентификатор is not a parameter
идентификатор не является параметром
В разделе объявления параметров определения функции по образцу старых версий идентификатор объявлен, но не перечислен в списке параметров. Либо уберите объявление, либо добавьте идентификатор в качестве параметра.
идентификатор is not legal here
идентификатор здесь недопустим
Спецификатор типа "идентификатор" здесь недопустим, поскольку он противоречит или дублирует другой спецификатор типа в данном объявлении, либо потому, что "идентификатор" используется в качестве имени typedef, тогда как имени typedef в данном контексте быть не может.
идентификатор is virtual and cannot be explicitly initialized
идентификатор виртуальный и не может быть явно инициализирован
Конструктор класса С++ пытается вызвать "идентификатор" конструктора базового класса, однако этот идентификатор относится к виртуальному базовому классу. Виртуальные базовые классы не могут быть инициализированы явно. Компилятор неявно вызывает конструктор базового класса по умолчанию base::base().
идентификатор must be a member function
идентификатор должен быть функцией-компонентом
Большинство функций-операций С++ может являться компонентами классов или обычными функциями, не входящими в класс, однако некоторые из них обязательно должны быть компонентами класса. Это функции operator =, operator ->, operator() и преобразования типов. Данная функция не является функцией-компонентом, но должна являться таковой.
идентификатор must be a member function or have an argument
of class type
идентификатор должен быть функцией-компонентом или иметь аргумент типа класса
Большинство функций-операций С++ должно иметь неявный или явный аргумент типа класса. Данная функция-операция была объявлена вне класса и не имеет явного аргумента типа класса.
идентификатор must be a previously defined class or struct
идентификатор должен быть ранее объявленным классом или структурой
Вы пытаетесь объявить идентификатор как базовый класс, тогда как он либо не является классом, либо не был еще полностью определен. Исправьте имя или реорганизуйте объявления.
идентификатор must be a previoustly defined enumeration tag
идентификатор должен быть ранее определенным тегом перечислимого типа
Данное объявление пытается обратиться к идентификатору, как к тегу типа enum, тогда как он не был объявлен в качестве такового. Исправьте имя или реорганизуйте объявления.
идентификатор must be a previoustly defined structuretag
идентификатор должен быть ранее определенным тегом структуры
Данное объявление пытается обратиться к идентификатору, как к тегу структуры, тогда как он не был объявлен в качестве такового.
Исправьте имя или реорганизуйте объявления.
идентификатор specifies multiple or duplicate access
идентификатор задает многократный или дублирующийся доступ
Базовый класс должен быть объявлен как public или private, но не то и другое одновременно. Спецификатор доступа не должен задаваться для базового класса более одного раза.
компонент is not accessible
компонент недоступен
Вы пытаетесь сослаться на "компонент" класса С++, который имеетатрибут доступа private илиprotected и недоступен из данной функции. Это иногда случается при попытке вызова доступной перегружаемой функции-компонента (или конструктора), когда заданные при этом аргументы совпадаютс аргументаминедоступной функции. Перед проверкой доступности всегда выполняется проверка разрешения перегрузки. Если проблема именно в этом, то для выбора желаемой доступной функции попытайтесь явно выполнить приведение типа для одного или более параметров.
спецификатор has already been included
спецификатор уже был включен
Данный спецификатор типа встречается в объявлении более одного раза. Удалите или измените один из них
= expected
= ожидается
Ожидалась операция присвоения для инициализации переменной.
, expected
, ожидается
В списке объявлений, инициализации или параметров ожидается запятая.
(* epected
(* ожидается
В качестве начала блока или инициализации ожидается левая фигурная скобка.
( expected
( ожидается
Перед списком параметров ожидается левая круглая скобка.
*) expected
*) ожидается
В конце блока или инициализации ожидается правая фигурная скобка.
) expected
) ожидается
В конце списка параметров ожидается правая круглая скобка.
: expected alter private/protected/publlc
: ожидается после private/protected/public
При использовании резервированных слов
private/protected/public для того, чтобы начать соответствующий раздел класса С++, за ними должно следовать двоеточие.
::requires a preceding identifier in this context
в данном контексте перед :: требуется идентификатор
В С++ в объявлении встретилось двойное двоеточие без предшествующего квалифицирующего имени класса. Неквалифицированное двойное двоеточие может использоваться только в выражениях для обозначения глобального контекста, а не в объявлениях.
.* operands do not match
операнды .* не соответствуют
Вы не объявили операнд правой части операции С++ (.*) как указатель на компонент класса, заданный левым операндом.
# operator not followed by macro argument name
за операцией # не следует имя аргумента макроса
В макро определении символ # может быть использован для обозначения преобразования аргумента макроса в строку. За # должно следовать имя аргумента макроса.
Access can only be changed to public or procted
Тип доступа может быть изменен только на public или protected
Производный класс С++ может модифицировать права доступа членабазового класса, но только на public или protected.
Компонент базового класса нельзя сделать private.
Access declarations cannot grant or reduce access
Объявления доступа не могут повысить или понизить права доступа
Производный класс С++ может модифицировать права доступа члена базового класса, но только путем восстановления прав базового класса. Он не может повысить или понизить права доступа.
Access specifier спецификатор found in a union
Спецификатор доступа встретился в объединении
Спецификаторы доступа С++ (public, private или
protected) не могут находиться в объединениях.
Ambiquity between функция1 and функция2
Неоднозначность между функцией1 и функцией2
С переданными параметрами могут использоваться обе названные перегруженные функции. Такая неоднозначность недопустима.
Ambiquous conversion functions: тип1 and тип2
Неоднозначность функций преобразования: тип1 и тип2
Компилятор нашел более одного способа преобразования данного типа в желаемый. Такая неоднозначность недопустима.
Array bounds missing ]
В задании границ массива отсутствует ]
В исходном файле в объявлении границ массива отсутствует закрывающая квадратная скобка.
Array must have at least one element
Массив должен иметь хотя бы один элемент
ANSI C и С++ требуют, чтобы массив определялся хотя бы с одним элементом (объекты нулевого размера недопустимы). Существует старый программистский прием, состоящий в том, чтобы объявить элемент структуры типа массива нулевого размера, а уже затем при помощи malloc распределить фактически требуемую память. Этот прием по-прежнему можно использовать, но теперь вы обязаны объявлять массив как имеющий (как минимум) один элемент. Разумеется, объявления (в противоположность определениям) массивов неизвестного размера допустимы.
Например,
char ray[] /* определение массива неизвестного размера недопустимо */
char ray[0] /* определение массива нулевого размера недопустимо */
Array of references is not allowed
Массив ссылок недопустим
Массив ссылок недопустим, поскольку указатели на ссылки недопустимы, а имена массивов встраиваются в указатели.
Array size too lange
Размер массива слишком велик
Объявленный массив превышает 64К.
Assembler statement too long
Слишком длинный ассемблерный оператор
Операторы встроенного ассемблирования не могут превышать по длине 480 байтов.
Attempting to return a reference to local name идентификатор Попытка вернуть ссылку на локальное имя идентификатор
Данная функция С++ возвращает значение типа ссылки, и вы пытаетесь вернуть ссылку на локальную (динамическую) переменную. Это недопустимо, поскольку такая переменная при выходе из функции разрушается. Вы можете вернуть ссылку на любую статическую или глобальную переменную, либо изменить функцию таким образом, чтобы возвращалась не ссылка, а само значение.
Bad file name format in inciude directive
Неправильный формат имени файла в директиве включения
Имена включаемых файлов должны заключаться в кавычки ("имя_файла.h") или в угловые скобки (). Перед именем файла отсутствовала открывающая кавычка или угловая скобка. Если использовался макрос, то результирующий текст расширения неверен; т.е., он не взят в кавычки.
Bad ifdef directive synfax
Неверный синтаксис директивы ifdef
Директива ifdef должна содержать в качестве тела директивы единственный идентификатор (и ничего более).
Bad ifndef directive synfax
Неверный синтаксис директивы ifndef
Директива ifndef должна содержать в качестве тела директивы единственный идентификатор (и ничего более).
Bad return type for a type conversion operator
Неверный тип возврата в операции преобразования типа
Данная функция-компонент преобразования типа С++задаеттип возврата, отличный от типасамой функции. Объявление функции преобразования operator T может не задавать типа возврата вообще.
Bad syntax for pure function definition
Неверный синтаксис определения "чистой" функции
Чистые виртуальные функции задаются добавлением в определение символов "=0". Вы написали что-либо похожее, но не совпадающее с требуемым в точности.
Bad undef directive syntax
Неверный синтаксис директивы undef
Директива #undef должна содержать в качестве тела директивы единственный идентификатор (и ничего более).
Base class класс is included more than once
Базовый класс включен более одного раза
Класс С++ может быть производным от любого числа базовых классов, но непосредственно от одного и того же класса он может быть производным только один раз.
Base class класс is initialized more than once
Базовый класс инициализируется более одного раза
В конструкторе класса С++ список инициализации, следующий за заголовком конструктора, включает указанный базовый класс более одного раза.
Base class cannot be declared protected
Базовый класс не может быть объявлен как protected
Базовый класс С++ может быть public или private, но не protected.
Bit field cannot be static
Битовое поле не может быть static
Только обычные данные-компоненты классов С++могут быть объявлены как static, но не битовые поля.
Bit fields must be signed or unsigned int
Битовые поля должны быть signed или unsigned int
Битовое поле должно быть объявлено с интегральным типом signed или unsigned. В ANSI C битовые поля могут быть только signed или unsigned int (но не char или long).
Bit fields must contain at least one bit
Битовые поля должны содержать как минимум один бит
Вы не можете объявить именованное битовое поле длиной 0 (или менее 0) битов. Можно объявить битовое поле нулевой длины без имени, по соглашению используемое для принудительной установки выравнивания битового поля по границе байта (или по границе слова, если выбрана опция выравнивания -a).
Bit field too large
Битовое поле слишком велико
Данная ошибка возникает при попытке определения битового поля длиной свыше 16 битов.
Body already defined for this function
Тело этой функции уже определено
Тело функции с этим же именем и типом уже встречалось выше. Тело функции может входить в программу только один раз.
Call of non-function
Вызов не-функции
Вызываемое имя не было объявлено как функция. Эта ошибка обычно возникает при неправильном объявлении или опечатке в имени функции.
Cannot assign идентификатор1 to идентификатор2
Присвоение идентификатора1 идентификатору2 невозможно
Обе стороны операции присвоения (=) (или составной операции присвоения типа +=) должны быть совместимыми и не должны являться массивами. Правая сторона данной операции присвоения имеет тип идентификатор1 и не может быть присвоена объекту слева, имеющему тип идентификатор2.
Cannot call 'main' from within the program
Вызвать 'main' из программы невозможно
С++ не позволяет рекурсивные вызовы 'main'.
Cannot cast from идентификатор1 to идентификатор2
Приведение между идентификатор1 и идентификатор2 невозможно
Приведение типа идентификатор1 к типу идентификатор2 здесь запрещено. В С указатель может быть приведен к интегральному типу или к другому типу указателя. Интегральный тип может быть приведен к любому интегральному типу, типу с плавающей точкой и указателю. Тип с плавающей точкой может быть приведен к интегральному или другому типу с плавающей точкой. Структуры и массивы не позволяют выполнение для них приведений типа. Также невозможны приведения для типа void.
В С++ проверяется наличие преобразований и конструкторов, определяемых пользователем, и в случае их отсутствияприменяются правила приоритета (за исключением указателей на компоненты класса). Из интегральных типов только для константы со значением ноль допускается приведение к типу указателя компонента. Указатель компонента допускает приведение к интегральному типуили аналогичному указателю компонента. Последний будет указывать на компонент данных, если на него был установлен исходный указатель, и на компонент-функцию, еслина нее был установлен исходный; квалифицирующий класс типа,к которому выполняется приведение, должен быть тем же, что и базовый класс оригинала.
Cannot create a varlable for abstract class класс
Создание переменной для абстрактного класса "класс" невозможно
Абстрактные классы - с чистыми виртуальными функциями - не могут использоваться непосредственно, допускается лишь создание производных от них классов.
Cannot define a pointer or reference to a reference
Определение указателя или ссылки на ссылку невозможно
Иметь указатель на ссылку или ссылку на ссылку нельзя.
Cannot find класс::класс (класс&) to copy a vector
Не найден класс::класс (класс&) для копирования вектора
Если класс С++ класс1 содержит вектор (массив) класса класс2 и вы хотите сконструировать объект типа класс1 из другого объекта типа класс1, то должен быть конструктор класс2::класс2(класс2&) такой, чтобы могли быть сконструированы элементы вектора. Данный конструктор принимает только один параметр (являющийся ссылкой на его класс) и называется конструктором ссылки.
Обычно компилятор создает конструктор ссылки автоматически. Однако, если вы определили конструктор для класса класс2, имеющего параметр типа класс2. и дополнительные параметры со значениями по умолчанию, то данный конструктор ссылки не может существовать и не может быть создан компилятором. (Вследствие того, что класс2::класс2(класс2&) и класс2::класс2(класс2&, int = 1) не различаются компилятором). Вы обязаны переопределить данный конструктор таким образом, чтобы не все параметры имели значения по умолчанию. Затем вы можете определить конструктор ссылки или позволить компилятору создать собственный.
Cannot find идентификатор::идентификатор() to
initialize a vector
Не найден идентификатор::идентификатор() для инициализации вектора
Если класс С++ класс1 содержит вектор (массив) класса класс2 и вы желаете сконструировать объект типа класс1, но при этом не из другого объекта типа класс1, то для конструирования элементов вектора должен быть использован конструктор класс2::класс2(). Такой конструктор без параметров называется конструктором по умолчанию. Если вы не определили для класса2 никакого конструктора, компилятор создаст конструктор по умолчанию автоматически; в противном случае будет использован ваш конструктор.
Cannot find класс::класс() to initialize base class
Не найден класс::класс для инициализации базового класса
При конструировании производного класса С++ класс2 сначала должен быть сконструирован каждый базовый класс класс1. Если конструктор для класса2 не задает конструктор для класса1 (как часть заголовка класса2), то для базового класса должен быть задан конструктор класс1::класс1(). Такой конструктор без параметров называется конструктором по умолчанию. Если вы не определили для класса1 никакого конструктора, компилятор создаст конструктор по умолчанию автоматически; в противном случае будет использован ваш конструктор.
Cannot find класс::класс() to initialize field идентификатор
Не найден класс::класс() для инициализации поля идентификатор
Если класс С++ класс1 содержит компонент класса класс2 и вы желаете сконструировать объект типа класс1, но при этом не из другого объекта типа класс1, то для конструирования этого компонента должен быть использован конструктор класс2::класс2(). Такойконструктор без параметров называется конструктором по умолчанию. Если вы не определили для класса2 никакого конструктора,компилятор создаст конструктор по умолчанию автоматически; в противном случае будет использованваш конструктор.
Cannot find класс::operator=(класс&) to copy a vector
Не найден класс::operator=(класс&) для копирования вектора
Если класс С++ класс1 содержит вектор (массив) класса класс2 и вы желаете скопировать класс типа класс1, то должна использоваться операция присвоения класс2::operator=(класс2&), позволяющая копирование элементов вектора. Обычно компилятор вставляет такую операцию автоматически. Однако, если вы определили operator= для класса2, но эта операция не принимает параметр класс2&, то компилятор не будет генерировать операцию автоматически - вы должны написать свою.
Cannot have a near membar in a far class
Компонент near в классе far недопустим
Все компоненты класса С++ far должны быть far. Данный компонент должен принадлежать классу, объявленному (или имеющему по умолчанию) атрибут near.
Cannot initialize a fieid
Инициализация поля невозможна
Отдельные поля структур, объединений и классов С++ могут не иметь инициализаторов. Структура или объединение могут быть инициализированы как единое целое при помощи инициализаторов в фигурных скобках. Класс С++ может быть инициализирован только при помощи конструктора.
Cannot initialize тип1 with тип2
Тип1 не может быть инициализирован типом2
Вы пытаетесь инициализировать объект типа тип1 значением типа тип2, что недопустимо. Правила инициализации те же, что и для присвоения.
Cannot modify a const object
Модификация объекта - константы невозможна
Недопустимая операция с объектом, объявленным константой, например, попытка присвоения такому объекту.
Cannot overioad 'main'
Перегрузка 'main' невозможна
main - это единственная функция, которая не может быть перегружена.
Cannot specify base classes except when defining the class Задавать базовые классы допустимо только при определе-
нии класса
При задании класса С++ базовые классы, производным от которых является данный класс, могут задаваться только в точке определения класса. При объявлении тега класса, например class c; задавать базовые классы недопустимо.
Case outside of switch
Оператор case вне оператора switch
Компилятор встретил оператор case вне оператора switch. Это часто случается при несоответствии числа правых и левых фигурных скобок.
Case statement missing :
В операторе case отсутствует :
Оператор case должен содержать выражение типа константы, за которым следует двоеточие. Либо в выражении оператора case отсутствует двоеточие, либо перед двоеточием находится лишнее символическое имя.
Character constant too long
Слишком длинная символьная константа
Символьные константы могут иметь длину только в один или два символа.
Class класс has a constructor and cannot be hidden
Класс имеет конструктор и не может быть скрытым
С имеет разные пространства имен для тегов структур и обычных имен, также как и С++. Это распространяется и на классы с конструкторами, поскольку объявления конструкторов похожи на объявления функций, и возможность их перепутать может привести к аварийному завершению.
Classes cannot be initialized with (**)
Классы не могут быть инициализированы при помощи (**)
Обычные структуры С могут инициализироваться набором значений в фигурных скобках. Классы С++ могут быть инициализированы только конструкторами, если класс имеет конструкторы, компоненты private, функции или базовые классы, являющиеся виртуальными.
Class member компонент declared outside its class Компонент класса объявлен вне своего класса
Функции компоненты класса С++могут быть объявлены только внутри объявления класса. В отличие от функций, не являющихся компонентами класса,они не могут иметь несколько объявлений или быть объявлены в других местах.
Compound statement missing *)
В составном операторе отсутствует *)
Компилятор дошел до конца исходного файла, но не обнаружил закрывающей фигурной скобки. Это обычно бывает при несовпадающем количестве правых и левых скобок.
Conflicting type modifiers
Противоречащие друг другу модификаторы типа
Это случается, когда в объявлении встречается, например, два ключевых слова - far и near, относящихся к одному и тому же указателю. Одному указателю может соответствовать только один модификатор адресации, а функция может иметь только один модификатор языка (cdecl, pascal или interrupt).
Constant expression required
Требуется выражение типа константы
Массивы должны объявляться с заданным константой выражением. Данная ошибка обычно бывает вызвана опечаткой в константе в #define.
Constructor cannot have a return type specification
Конструктор не может иметь спецификации типа возврата
Конструкторы С++ имеют неявный тип возврата, используемый компилятором, но вы не можете объявить для них тип возврата или возвращаемое значение.
Conversion of near pointer not allowed
Преобразование ближнего указателя недопустимо
Ближний указатель не может быть преобразован в дальний при вычислении выражения, если программа в текущий момент не выполняется. Причина этого состоит в том, что для преобразования требуется знать текущее значение DS программы пользователя, которое в данный момент просто не существует.
Could not find a match for аргумент(ы)
Не найдено соответствие аргументу (аргументам)
Не найдена функция С++ с параметрами, соответствующими заданным аргументам.
Could not find file имя_файла
Компилятор не может найти файл, заданный в командной строке.
Declaration does not specify a tag or an identifier
В объявлении не указан тег или идентификатор
Данное объявление ничего не объявляет. Это может быть структура или объединение без тега или переменная в объявлении. С++ требует, чтобы что-то было объявлено.
Declaration is not allowed here
Объявление здесь недопустимо
Объявления не могут использоваться в управляющих операторах для операторов while, for, do. if или switch.
Declaration missing ;
В объявлении отсутствует ;
В исходном файле содержится объявление поля структуры или объединения, в котором отсутствует точка с запятой (;).
Declaration syntax error
Синтаксическая ошибка в объявлении
Исходный файл содержит объявление, в котором отсутствует некоторый символ имя или наоборот имеются лишние.
Declaration terminated incorrectiy
Неправильное окончание объявления
Объявление содержит лишний илиневерный конечный символ, например, точка с запятой,помещенная после тела функции. Эту ошибку также дает функция-компонент С++, объявленная в классе с точкой с запятой между заголовком и открывающей левой фигурной скобкой.
Declaration was expected
Ожидается объявление
Ожидалось, но не найдено объявление. Это обычно бывает при отсутствии разделителя, например, запятой, точки с запятой, правой круглой скобки или правой квадратной скобки.
Declare operator delete (void*) or (void*,size_t)
Операция delete объявляется (void*) или (void*,size_t)
Операция delete объявляется с одним параметром void*, либо с двумя, где вторым является size_t. При использовании второй версии она будет использована с большим приоритетом, нежели первая. Глобальная операция delete всегда объявляется с двумя параметрами, поэтому будьте осторожны при переопределении этого объявления.
Default outside of swich
Оператор default вне оператора switch
Компилятор встретил оператор default вне оператора switch. Это чаще всего бывает при несовпадении числа правых и левых фигурных скобок.
Default value missing
Отсутствует значение по умолчанию
Если в функции С++ объявляется параметр со значением по умолчанию, все последующие параметры также должны иметь умолчания. В данном объявлении за параметром со значением по умолчанию следует параметр без умолчания.
Define directive needs an identifier директиве define необходим идентификатор
Первый не-пробельный символ после #define должен являться идентификатором. Компилятор встретил на этом месте какие-либо другие символы.
Destructor cannot have a return type specification
Деструктор не может иметь спецификации типа возврата
Деструкторы С++ не имеют типа возврата, и вы не можете объявить тип или значение возврата.
Destructor for класс is not accessibie
Деструктор для класса недоступен
Деструктор для данного класса является protected или private и недоступен из данной точки для разрушения класса. Если деструктор класса является private, класс не может быть разрушен и потому не может никогда быть использован. Это наверняка ошибка. Деструктор protected позволяет доступ только из производных классов. Это полезно для того, чтобы предотвратить создание базовых классов, обеспечив создание из них производных классов.
Destructor name must match the class name
Имя деструктора должно соответствовать имени класса
В классах С++ объявление деструктора класса вводится символом тильда. Имя деструктора должно совпадать с именем класса. В вашем исходном файле тильда предшествует какому-то другому имени.
Division by zero
Деление на ноль
В исходном файле встретилось выражение типа константы, представляющее собой нулевой делитель.
do statement must have while
оператор do должен иметь while
В исходном файле встретился оператор do без соответствующего ограничивающего ключевого слова while.
do-whlle statement missing (
В операторе do-while отсутствует (
В операторе do компилятор не нашел левой круглой скобки после ключевого слова while.
do-whlle statement missing )
В операторе do-while отсутствует )
В операторе do компилятор не нашел правой круглой скобки после условного выражения.
do-whlle statement missing ;
В операторе do-while отсутствует ;
В условном выражении оператора do компилятор не нашел точки с запятой после правой круглой скобки.
Dulicate case
Повторение case
Каждое ключевое слово case оператора switch должно иметь уникальное значение выражения типа константы.
Enum syntax error
Синтаксическая ошибка в enum
Объявление enum не содержит правильно оформленного списка идентификаторов.
Error directive: сообщение
Директива error: сообщение
Данное сообщение появляется при обработке директивы #error из исходного файла. Текст этой директивы выводится в "сообщении".
Error writing output file
Ошибка при записи выходного файла
Ошибка DOS при попытке Turbo C++ вывести .OBJ, .EXE или временный файл. Проверьте опцию командной строки -n или установку меню Options \! Directiries \! Output directory интегрированной среды, правильно ли задана директория для вывода. Также убедитесь, что на диске достаточно места.
Expression expected
Ожидается выражение
Здесь ожидалось выражение, а текущий символ не может начинать выражение. Это сообщение может выдаваться, когда ожидается управляющее выражение в предложении if или while, либо при инициализации переменной. Сообщение часто появляется в результате случайно вставленного или удаленного из исходного файла символа.
Expression is too complicated
Слишком сложное выражение
Компилятор может обрабатывать очень сложные выражения, однако некоторые выражения с сотнями компонентов могут оказаться слишком сложными. Такие выражения следует разбивать на две или более частей.
Expression of arithmetic type expected
Ожидается выражение арифметического типа
Унарные операции плюс (+) и минус (-) требуют выражений арифметического типа - допустимыми являются только типы char, short, int long, enum, float, double и long double.
Expression of integral type expected
Ожидается выражение интегрального типа
Операция дополнения (тильда ) требует выражения интегрального типа - допустимыми являются только типы char, short, int, long или enum.
Expression of scalar type expected
Ожидается выражение скалярного типа
Операции "не" (!), инкремента (++) и декремента (--) требуют выражений скалярного типа - допустимыми являются только типы char, short, int, long, enum, float, double, long double и типы указателей.
Expression syntax
Синтаксис выражения
Это обобщенное сообщение об ошибке, выдаваемое, когда компилятор при лексическом анализе выражения встречает какую -либо серьезную ошибку. Наиболее часто она встречается, если подряд встречается две операции, либо при отсутствии или несоответствии числа круглых скобок, либо при отсутствии точки с запятой в предыдущем выражении.
Expression type does not match the return type
Тип выражения не соответствует типу возврата
Тип выражения return не может быть преобразован к типу возврата функции.
extern variable cannot be initialized
Переменная extern не может быть инициализирована
Класс памяти extern применительно к переменной означает, что переменная здесь объявляется, но не определяется - распределение памяти для нее не происходит. Следовательно, инициализация переменной в объявлении невозможно.
Extra parameter in call
Лишние параметры в вызове
Вызов функции через указатель, определенный в прототипе, содержит слишком много аргументов.
Extra parameter in call to функция
Лишние параметры в вызове функции
Вызов названной функции (которая была определена с прототипом) содержит слишком много аргументов.
Field поле cannot be used without an object
Поле не может быть использовано без объекта
Это означает, что пользователь написал класс::поле, где поле является обычным (не-статическим) компонентом, ичто класс, связанный с этим полем, отсутствует. Например, можно написать объект.класс::поле, но нельзя: класс::поле.
Field поле is ambiguous in class
Неоднозначно задан класс поля
Вы должны квалифицировать ссылку на поле соответствующим именем базового класса. В классе С++ "класс" поле "поле" могло иметься в нескольких базовых классах и не было квалифицировано конкретным классом. Это могло произойти только при множественном наследовании, когда имя поля в каждом базовом классе не скрыто тем же именем поля в производном классе по тому же пути. Правила языка С++ требуют выполнение данной проверки неоднозначности до проверки прав доступа (private, protected, public). Следовательно, возможно получение данного сообщения даже при том, что доступ возможен только к одному полю (или вообще ни к одному не возможен).
Field identifier expected
Ожидается идентификатор поля
Ожидалось, но не найдено имя поля структуры или класса С++. Справа от операции (.) или (->) должно находиться имя поля структуры или класса, указанных слева от операции.
File must contaln at least one external declaration
Файл должен содержать хотя бы одно объявление external
Данная единица компиляции было логически пустой и не содержала никаких объявлений. ANSI C и С++ требуют, чтобы в единице компиляции находились какие-нибудь переменные.
File name too long
Слишком длинное имя файла
Имя файла в директиве #include было слишком длинным для обработки его компилятором. Имена файлов в DOS не могут быть длиннее чем 79 символов.
For statement missing (
В операторе for отсутствует (
В операторе for компилятор не нашел левой круглой скобки после ключевого слова for.
For statement missing )
В операторе for отсутствует )
В операторе for компилятор не нашел правой круглой скобки после управляющего выражения.
For statement missing ;
В операторе for отсутствует ;
В операторе for компилятор не нашел точки с запятой после одного из выражений.
Found : instead of ::
: вместо ::
Вы использовали двоеточие (:) вместо двойного двоеточия (::) в качестве разделителя квалификатора класса С++ и поля в объявлении или в выражении.
Friend declarations need a function signature
Объявления friend требуют точного указания функции
При объявлении функции friend вы должны задать типы параметров таким образом, чтобы из всех перегруженных функций могла быть выбрана верная.
Friends must be functions or classes, not fields
Друзья должны быть функциями или классами, но не полями
Друг (friend) класса С++ должен быть функцией или другим классом; поле не может быть другом.
Function call missing )
В вызове функции отсутствует )
Список аргументов при вызове функции содержит какую-то синтаксическую ошибку, например, отсутствует закрывающая правая скобка.
Function calls not supported
Вызовы функции не поддерживаются
При вычислении выражения интегрированным отладчиком вызовы функций (включая функции неявного преобразования, конструкторы, деструкторы, перегруженные операции и встраиваемые функции) не поддерживается.
Function defined inline after use as extern
Функция определена как встраиваемая после объявления extern
Функцию нельзя определить как встраиваемую (inline) после того, как она была уже была использована. Или переставьте определение inline выше в тексте, или удалите его совсем.
Function definition cannot be a typedef'ed declaration
Определение функции не может быть объявлением typedef
Объявления указателей становятся более читаемыми при использовании typedef. Однако, в С++ такие typedef не могут быть использованы для определения функций.
Например, тип F - это функция без параметров, возвращающая int:
typedef int F(void);
Определение g в качестве такой функции недопустимо:
F g (* /* ... */ *)
Однако можно определить g как функцию, возвращающую указатель на тип F.
F *g(...) (* /* ... */ *)
Function функция cannot be static
Функция не может быть статической
Только обычные функции-компоненты и операции new и delete могут быть объявлены static. Конструкторы, деструкторы и прочие операции не могут быть статическими.
Function cannot return arrays or functions
Функции не могут возвращать массивы или функции
Функция объявлена как возвращающая функцию или массив, вместо указателя функции или элемента массива.
Function should return a value
Функция должна возвращать значение
Данная функция была объявлена (возможно, неявно) как возвращающая значение. Оператор return не содержит значения возврата или найден конец функции, а оператор возврата не встретился. Либо укажите значение возврата, либо измените объявление функции на void.
Functions may not be part of a struct or union
Функции не могут быть частью структуры или объединения
Данное поле структуры или объединения С было объявлено с типом функции, а не указателя функции. Функции в качестве полей разрешены только в С++.
Global anonimous union not static
Глобальное анонимное объединение не static
В С++ глобальное анонимное объединение на уровне файла должно быть static.
Goto statement missing label
Отсутствует метка в операторе goto
За ключевым словом goto должен следовать идентификатор.
Group overflowed maximum size: имя
Группа превысила максимальный размер: имя
Общий размер сегментов в группе (например, в DGROUP) превысил 64К.
Identifier идентификатор cannot have a type qualifier
Идентификатор идентификатор не может иметь квалификатор типа
Квалификатор С++ класс::идентификатор здесьнеприменим. Квалификатор не разрешен для имен typedef, объявлений функций(за исключением определения на уровне файла) или локальных переменных и параметров функций, либо для компонентов класса, заисключением использования как квалификатора собственного имени класса (избыточно, но допустимо).
Identifier expected
Ожидается идентификатор
Здесь ожидался идентификатор, но не был найден. В С это может случиться в списке параметров старого заголовка функции, после резервируемых слов struct или union при отсутствии фигурных скобок, а также при отсутствии имени поля структуры или объединения (за исключением битовых полей нулевой длины). В С++ идентификатор также ожидается в списке базовых классов, производным от которых является данный, после двойного двоеточия (::) и после резервируемого слова operator при отсутствии символа операции.
If statement missing (
В операторе if отсутствует (
В операторе if компилятор не нашел левой круглой скобки после ключевого слова if.
If statement missing )
В операторе if отсутствует )
В операторе if компилятор не нашел правой круглой скобки после выражения проверки.
Illegal character символ (0xзначение)
Недопустимый символ символ (0хзначение)
Компилятор встретил в исходном файле недопустимый символ. Выводится также шестнадцатиричное значение этого символа. Это сообщение может выдаваться вследствие лишних параметров, переданных макросу функции.
Illegal initialization
Недопустимая инициализация
Инициализация может выполняться либо выражением типа константы, либо адресом глобальной extern или static переменной плюс или минус константа.
Illegal octal digit
Недопустимая восьмеричная цифра
Компилятор встретил восьмеричную константу с недопустимой в восьмеричных числах цифрой (8 или 9).
Illegal parameter to __emit__
Недопустимый параметр __emit__
Существуют некоторые ограничения на помещение литеральных значений непосредственно в код. Например, вы не можете передать локальную переменную как параметр в __emit__. Объяснения см. в описании функции __emit__.
Illegal pointer substraction
Недопустимое вычитание указателя
Выдается при попытке вычитания указателя из не-указателя.
Illegal structure operation
Недопустимая операция со структурой
Структуры могут использоваться только в операциях точки (.), адреса (&) или присвоения (=), либо передаваться в функции и из функций в качестве параметров. Компилятор встретил структуру, используемую с какой-либо другой операцией.
Illegal to take address of bit field
Недопустимо брать адрес битового поля
Недопустимо брать адрес битового поля, хотя брать адрес любых других полей можно.
Illegal use of floating point
Недопустимое использование плавающей точки
Операнды с плавающей точкой недопустимы в операциях сдвига, поразрядных булевых операциях, условных операциях (? :), обращения по ссылке (*) и некоторых других операциях. Компилятор обнаружит число с плавающей точкой в качестве операнда одной из этих операций.
Illegal use of pointer
Недопустимое использование указателя
Указатели могут использоваться операциями сложения, вычитания, присвоения, обращения по ссылке (*) и стрелки (->). В исходном файле обнаружен указатель с какой-либо другой операцией.
Improper use of a typedef идентификатор
Неправильное использования typedef идентификатор
В исходном файле символическое имя typedef встретилось в выражении на месте переменной. Проверьте объявление этого имени и возможные опечатки.
Improper use of a typedef symbol
Неправильное использования символического имени typedef
В исходном файле символическое имя typedef встретилось в выражении на месте переменной. Проверьте объявление этого имени и возможные опечатки.
Incompatible type conversion
Несовместимое преобразование типа
Требуемое приведение типа невозможно.
Incorrect command-line option: опция
Неправильная опция командной строки: опция
Компилятор не распознает параметр командной строки как допустимую опцию.
Incorrect configuration file option: опция
Неправильная опция файла конфигурации: опция
Компилятор не распознает параметр файла конфигурации как допустимую опцию; проверьте наличие ведущего дефиса (-).
Incorrect number format
Неправильный формат числа
Компилятор встретил в шестнадцатиричном числе десятичную точку.
Incorrect use of default
Неправильное использование слова default
Компилятор не нашел после ключевого слова default двоеточия.
Inline assembly not allowed in an inline function
Встроенное ассемблирование во встраиваемой функции запрещено
Компилятор не может обрабатывать операторы встроенного ассемблирования внутри встраиваемых (inline) функций С++. Ассемблерные операторы могут быть оформлены в макрос, либо вы можете убрать класс памяти inline, или можно убрать встроенные ассемблерные коды.
Invalid indirection
Недопустимое обращение по ссылке
Операция обращения по ссылке (*) требует в качестве операнда не-пустого (не void) указателя.
Invalid macro argument separator
Недопустимый разделитель аргументов макроса
В определении макроса аргументы должны разделяться запятыми. Компилятор встретил после последнего имени аргумента другой символ разделителя.
Invalid point addition
Недопустимое сложение указателя
В исходном файле встретилась попытка сложения двух указателей.
Invalid use of dot
Недопустимо использование точки
За операцией "точка" (.) должен непосредственно следовать операнд.
Items of type тип need constructors and can't be passed with ... Элементы типа тип требуют конструкторов и не могут быть переданы с ...
Недопустимо передавать объект с типом, для которого необходим конструктор, в переменном списке аргументов (задаваемом с ...)
Left side must be a structure
Левая часть должна быть структурой
Левая часть операции "точка" (.) (или операции С++ "точка со звездочкой") должна иметь тип структуры. В данном случае это не так.
Linkage specification not allowed
Спецификация компоновки не разрешается
Спецификации типа компоновки, например extern "C", допустимы только на уровне файла. Перенесите данное объявление функции на уровень файла.
Lvalue required
Требуется именующее значение
Левая часть операции присвоения должна являться адресуемым выражением. Сюда входят числовые переменные или указатели-переменные, ссылки на поля структур, либо обращение по ссылке через указатель, либо элемент массива, заданный индексом.
Macro argument syntax error
Синтаксическая ошибка в аргументе макроса
Аргумент в определении макроса должен являться идентификатором. Компилятор встретил некоторый символ, который не может являться частью идентификатора, там, где ожидался аргумент.
Macro expansion too long
Слишком длинное макрорасширение
Размер макрорасширения не может превышать 4,096 символов.
main must have a return type of int
main должна иметь тип возврата int
К функции main предъявляются специальные требования; одно из них состоит в том, что она не может иметь тип возврата иной, нежели int.
May compile only one file when an output file name is given При заданном имени выходного файла возможна компиляция
только одного файла
Вы задали опцию командной строки -о, которая позволяет только одно имя выходного файла. Первый файл компилируется, а остальные файлы игнорируются.
Member компонент initialized more than once
Компонент инициализируется более одного раза
В конструкторе класса С++ список инициализации, следующий за заголовком конструктора, включает одно и то же поле более одного раза.
Member functions can only have static storage class
Функции-компоненты могут иметь только класс памяти static
Единственным классом памяти, допустимым для функции-компонента, является static.
Misplaced break
Неправильно расположенный break
Компилятор обнаружил оператор break вне конструкции оператора switch или цикла.
Misplaced continue
Неправильно расположенный continue
Компилятор обнаружил оператор continue вне конструкции цикла.
Misplaced decimal point
Неправильно расположенная десятичная точка
Компилятор обнаружил десятичную точку в экспоненте константы с плавающей точкой.