Компиляция нескольких файлов 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. Сказав это, это плохой выбор и ломается для всех, кроме самых простых программ.