Глобальная статическая функция все еще работает в другом файле - PullRequest
2 голосов
/ 06 марта 2019

Я объявил глобальную статическую функцию в одном файле

a.c

static void Func1(void);
void Func2(void);

void Func1(void) {
    puts("Func1 Called");
}

void Func2(void) {
    puts("Func2 Called");
}

и доступ к нему в b.c

#include <stdio.h>
#include "a.c"
void main() {
    Func1();
    Func2();
}

программа успешно выполнена, но согласно предоставленной информации это должно привести к ошибке: undefined reference to Func1. Что здесь происходит не так?

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Вы не включаете исходный файл в другой, вы компилируете и связываете их вместе.

В вашем случае, говоря #include "a.c", вы по существу помещаете весь контент a.c в b.c и затем запускаете компиляцию, чтобы функции static и их вызовы присутствовали в одном и том же переводе. Блок. Таким образом, для компилятора не возникает проблем с поиском вызываемой функции.

Вместо этого, если вы делаете что-то вроде

gcc a.c b.c -o a.out //try to compile and link together

вы увидите ожидаемую ошибку, так как в этом случае a.c и b.c будут двумя отдельными единицами перевода.

0 голосов
/ 06 марта 2019

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

...