Интересный аспект стандарта языка Си, на который я раньше никогда не обращал внимания. Итак, следующий код:
int main() {
void *a, *b;
a = foo(b);
return 0;
}
Прототип функции foo не объявлен. Если теперь оттранслировать этот код (без линковки), то код соберется нормально и мы не получим никаких сообщений об ошибках, только предупреждения:
$ gcc -c -Wall test.c
test.c: In function ‘main’:
test.c:4: warning: implicit declaration of function ‘foo’
test.c:4: warning: assignment makes pointer from integer without a cast
Компилятор сообщает нам, что функция foo объявлена неявно и т.к. он не видел прототипа этой функции, то (по стандарту) делается ряд предположений. Например предполагается, что функция возвращает int, что влечет за собой следующее предупреждение о том, что из этого самого предполагаемого int‘а мы пытаемся неосторожно сделать указатель. Об этом и других предполложениях сказано в стандарте C89, раздел 3.3.2.2 Function calls. В новом стандарте C99 о неявном преобразовании возвращаемого типа функции ничего не говориться, или я не заметил. См. также Draft ANSI C Rationale, 3.3.2.2 Function calls.
В общем и целом, сделано всё это для совместимости со старыми библиотеками.
Ошибка о том, что данная функция не определена вылезает только на этапе линковки:
$ gcc -Wall test.o
test.o: In function `main':
test.c:(.text+0x12): undefined reference to `foo'
collect2: ld returned 1 exit status
link
link
Ярлыки
- С++ (3)
- Стихи (1)
- тонировка (1)
- Цитаты (2)
- ALTlinux (1)
- Apache (2)
- big-endian (1)
- Blogger (1)
- books (3)
- books links (1)
- Buisness (10)
- C (1)
- C# (5)
- c++ (27)
- car (8)
- Cheat (1)
- CSS (1)
- DLL (1)
- Draw (1)
- Eclipse (2)
- Films (1)
- Firefox (4)
- Flash (1)
- GTK (2)
- GUI (1)
- Home server (1)
- Hotels (1)
- HTML (6)
- IE (1)
- Internet (2)
- Java (1)
- JavaScript (6)
- jQuery (1)
- KDE (1)
- KeeTouch (1)
- Linux (34)
- little-endian (1)
- Makefile (1)
- MFC (6)
- multi-thread (2)
- Music (1)
- ODBC (2)
- OpenBox (2)
- photo (4)
- PHP (38)
- programing (2)
- proxy (1)
- QML (37)
- Qt (41)
- QtCreator (2)
- RegExp (3)
- Shopping (12)
- shutdown (1)
- Soft (1)
- Sound Card (1)
- SQL (1)
- SQL Server (14)
- Subversion (1)
- SVN (1)
- teach (4)
- text-editor (1)
- Travels (1)
- Ubuntu (38)
- Upstart (1)
- Vi (2)
- VirtualBox (2)
- Virtualization (1)
- vkontakte.ru (1)
- Web (2)
- Web-Kit (5)
- WinAPI (7)
- Windows (4)
Комментариев нет:
Отправить комментарий