Если бы main.c
и test.c
были отдельными единицами перевода , вы были бы правы.Однако, включив текст test.c
непосредственно в main.c
, вы создали одну единицу перевода, так что статическая функция видна main
.Он ведет себя , как если бы вы записали все как один файл.
Вы не хотите #include
файлы, содержащие переменную или функцию определения ;Это хороший способ столкнуться с несколькими ошибками определения во время компиляции или компоновки.Вместо этого содержимое файлов #include
должно быть ограничено определениями типов, объявлениями неопределенных переменных и объявлениями функций.
Вы можете создать файл test.h
следующим образом:
#ifndef TEST_H // include guard; prevents this file from being processed
#define TEST_H // more than once per translation unit
void foo(); // declaration for foo; this is the only function we're exposing
#endif
, затем переписать main.c
как
#include "test.h"
int main(void)
{
test();
return 0;
}
Затем вы скомпилируете main.c
и test.c
отдельно, а затем связать получившиеся объектные файлы для создания вашего исполняемого файла:
gcc -c main.c
gcc -c test.c
gcc -o test main.o test.o
На этом этапе вы получите ошибку компоновщика в порядке «неопределенной ссылки», поскольку символ для test
hasnне был экспортирован.