Компиляция нескольких файлов C в программе
У меня есть следующие два файла:
file1.c
int main(){
foo();
return 0;
}
file2.c
void foo(){
}
Можно ли скомпилировать и связать два файла вместе, чтобы file1.c
распознал функцию foo
без добавления extern
?
Обновлен прототип.
gcc file1.c file2.c throws: warning: неявное объявление функции foo.
Ответы
Ответ 1
Вам не нужен extern
, но file1.c должен видеть объявление, которое foo()
существует. Обычно это объявление находится в файле заголовка.
Чтобы добавить объявление вперед без использования файла заголовка, просто измените файл file1.c на:
int foo(); // add this declaration
int main(){
foo();
return 0;
}
Ответ 2
Правильный способ выглядит следующим образом:
file1.c
#include <stdio.h>
#include "file2.h"
int main(void){
printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
foo();
return 0;
}
file2.h
void foo(void);
file2.c
#include <stdio.h>
#include "file2.h"
void foo(void) {
printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
return;
}
output
$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file
file1.c:main:6
file2.c:foo:6
$
Ответ 3
Вы можете, но не должны.
Используйте файл заголовка, file2.h:
// file2.h
void foo(); // prototype for function foo()
Затем добавьте:
#include "file2.h"
в файле1.c
Скомпилировать:
$ gcc -Wall file1.c file2.c -o foo
Как правило, лучше (более надежно) использовать заголовочный файл для определения интерфейса каждого модуля, а не специальных прототипов в зависимых модулях. Это иногда называют принципом SPOT (Single Point Of Truth).
Ответ 4
Это уродливо, но с помощью gcc вы могли:
gcc -include file2.c file1.c
-include
- это флаг для препроцессора, который будет содержать содержимое файла file2.c в самом верху файла file1.c. Сказав это, это плохой выбор и ломается для всех, кроме самых простых программ.