Четвертый BORLAND С++ и его окружение

       

Общие сообщения об ошибках и предупреждения компилятора


В данном разделе описываются некоторые наиболее общие ошибки

и предупреждения, обнаруживаемые компилятором.

Call to function имя_функции with no prototype


(Вызов функции без прототипа)

Данное предупреждение означает, что функция используется перед ее прототипизацией или описанием. Это предупреждение может

выводиться также, когда функция, не воспринимающая аргументов, не

описана прототипом с void.

Conversion may lose signifigant digits


(Преобразование может привести к потере значимых цифр)

Это предупреждение является результатом преобразования компилятором значения, например, LONG в int. Оно сообщает, что вы

можете потерять информацию. Если вы уверены, что таких проблем не

возникает, то с помощью соответствующего явного приведения типа к

меньшему размеру это предупреждение можно подавить.



Function should return a value


(Функция должна возвращать значение)

Функция, описанная как возвращающая значение, значения не

возвращает. В старом коде Си, отличном от стандарта ANSI, такое

предупреждение является общим для функций, не возвращающих значения и не имеющих типа возврата:

foo(i)

int i;

{

...

}

Описанные таким образом функции интерпретируются компилятором, как возвращающие int. Если функция ничего не возвращает, ее

следует описать так:

void foo(int i)

{

...

}

Lvalue required


(Требуется именующее значение)

Type mismatch in parameter


(Несовпадение типа в параметре)

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

STRICT описателей, а также LRESULT, WPARAM и LPARAM внутренним

образом описываются как указатели, поэтому попытка передачи в качестве указателя int, WORD или LONG дает в результате подобные

ошибки.

Эти ошибки следует исправлять путем описания отличных от

указателя значения, используемых при передаче параметров или

присваивании. В случае специальных констант, таких как (HWND)1,

вам следует пользоваться новыми макрокомандами (такими как

HWND_BOTTOM). Ошибки несоответствия типов следует подавлять в


исключительных случаях ( так как часто это может дать в результате

некорректный код).

Non-portable conversion

(Не переносимое преобразование)

Вы приводите указатель или описатель ближнего типа к 32-битовому значению, такому как LRESULT, LPARAM, LONG или DWORD. Это

предупреждение практически всегда указывает на ошибку, так как

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

Чтобы избежать этого предупреждения и обеспечить размещение

в старших 16 битах 0, нужно привести тип описателя к UINT:

HWND hwnd;

LRESULT result = (LRESULT)(UINT)hwnd;

В тех случаях, когда вы хотите, чтобы 32-битовое значение

содержало указатель FAR, можно избежать предупреждения путем явного приведения типа к дальнему указателю:

char near* pch;

LPARAM lparam = (LPARAM)(LPSTR)pch;

Not an allowed type



(Не является допустимым типом)

Это сообщение об ошибке обычно выводится в результате попытки разыменования указателя void. Обычно это бывает при непосредственном использовании значения-указателя, возвращаемого GlobalLock или LocalLock. Чтобы решить данную проблему, перед использованием указателя присвойте возвращаемое значение переменной соответствующего типа (используя при необходимости приведение типа).

Size of the type is unknown or zero



(Размер типа неизвестен или равен нулю)

Вы пытаетесь с помощью + или += изменить значение пустого

указателя. Это ошибка обычно появляется в результате того, что

отдельные функции Windows (например, GlobalLock или LocalLock)

возвращающие указатели произвольных типов, определены для возврата void FAR* вместо LPSTR. Чтобы решить эту проблему, присвойте

значение void* описанной соответствующим образом переменной (приведя при необходимости тип):

BYTE FAR* lpb = (BYTE FAR*)GlobalLock(h);

lpb += sizeof(DWORD);

Type mismatch in redeclaration of имя_параметра



(Несовпадение типа при повторном описании параметра)

В вашей программе имеется несогласованное описание переменной, параметра или функции. Используя API Win32, вы можете внести

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

переносимой.


Содержание раздела