При компиляции file2.c компилятор не может наблюдать, что объявление в нем не совпадает с объявлением в file1.c, поскольку при компиляции file2.c компилятор не знает содержимого из file1.c.
Некоторые компоновщики имеют функции, которые могут помочь с этим. Тем не менее, это не распространенная практика для связывания объектов C. (Возможно, так и должно быть.)
Такое несоответствие обычно обрабатывается с помощью заголовочных файлов. Общепринятая практика - включать объявления из заголовка, а не вводить их вручную в другие исходные файлы. Для этого:
- Создайте file1.h и поместите в него
void p(int a);
.
- В file1.c вставить
#include "file1.h"
.
- В file2.c вставьте
#include "file1.h"
и удалите объявление p
.
Цель включения file1.h в file1.c состоит в том, чтобы компилятор увидел и объявление в file1.h, и определение в file1.c, и он будет жаловаться, если они несовместимы.
Тогда, поскольку file1.h включен в file2.c, мы уверены, что объявление, замеченное при компиляции file2.c, совместимо с определением в file1.c.