Задать вопрос
simplecode
@simplecode

Компиляция программы на C?

Здравствуйте!

Имеется компилятор gcc version 4.4.3 (Ubuntu) и два файла:

~/test/main.c
#include <stdio.h>
int main() {
    int x = next(6);
    printf("%d\n", x);
    return 0;
}


~/test/next.c
int next(int a) {
    return a + 1;
}


Пытаюсь скомпилировать (.h файла к next.c НЕТ!):
gcc main.c next.c -o test

компилируется и собирается.

Подскажите, как это происходит без заголовочного файла?
  • Вопрос задан
  • 3244 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@Eddy_Em
Советую заменить «int next(int a)» на «double next(double a)». Тогда будет веселее.
Если компилировать с -Wall -Werror, gcc сматюгнется и собирать ничего не будет. Если без этих ключей — предупредит, что функция next по умолчанию считалась как возвращающая int. А вот когда она реально double будет возвращать, могут быть какие-нибудь неожиданные последствия (а может их и не быть).
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@NiGHt_LEshiY
Объявление функции необязательно. В таком случае компилятор подразумевает, что функция имеет любое количество аргументов и возвращает int. Прототип: int func();
В процессе линковки функция нашлась в next.o, а значит всё хорошо %)
Ответ написан
Комментировать
kostik450
@kostik450
>Подскажите, как это происходит без заголовочного файла?

Когда компилятор делает .o файлы, там название функции next будет без манглинга, то есть просто _next
И когда ld (он же линкер) собирает из двух .o в один исполняемый файл то будет всё Ок.

А если делать на С++ (он же g++) этот фокус не пройдет, потому что там будет манглинг имен и в одном .o файле получится типа _next@gcvd а в другом _next@vdsf и линкер это не соберёт. Хотя на С++, похоже, компилятор тоже ругнется, что встретил девушку полумесяцем бровь функцию без заголовка.
Ответ написан
Комментировать
@da0c
Так у вас и нет включения заголовочного файла next.h!
Т.е. в next.с нет строки:
#include "next.h"

а есть только включение стандартного stdio.h
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы