Компиляция нескольких источников в C - PullRequest
3 голосов
/ 02 августа 2011

Допустим, у нас есть 2 исходных файла:

main.c:
#include <stdio.h>
#define i 2

int main(){
    printf("sum(%d) = %d", i, sum(i));
    return 0;
}
sum.c:
int sum(int i){
    int a, sum;
    for(a = 0, sum = 0; a < i; a++)
        sum += a;
    return sum;
}

Если я скомпилирую их, используя

gcc main.c sum.c 

, я получурабочий исполняемый файл.Я запутался, потому что думал, что это не должно работать, так как функция sum идет после main>, нет никакого намека на функцию sum, как ее объявление до main.

Это из-за одного из этапов компиляции (например, редактирование ссылок)?Кроме того, это плохая практика (я должен был использовать заголовочный файл с объявлением sum)?

Ответы [ 2 ]

8 голосов
/ 02 августа 2011

Я запутался, потому что думал, что это не должно работать, так как функция sum идет после main> нет никакого намека на функцию sum, как ее объявление перед main.

Когдадекларации нет, компилятор предполагает , что есть такая функция, которая возвращает int (к счастью, это так), и компоновщик находит нужный символ, но все же ...

Это из-за одного из этапов компиляции (например, редактирования ссылок)?

Ну да, компоновщик пытается разрешить неразрешенные символы из компиляции.

Это плохая практика (должен ли я использовать заголовочный файл с объявлением суммы)?

Да, вы должны или объявить функцию перед main.

2 голосов
/ 02 августа 2011

Заголовочные файлы должны быть использованы.Таким способом вы можете экспортировать функции / API библиотек вашей программы в C.

Компиляция работает, потому что компоновщик ищет определение функции в файлах, следующих за тем, в котором она используется.Поскольку он находится в sum.c, компоновщик работает и работает.

...