Использование ключевого слова extern для вызова функций
Я хочу вызвать функции, определенные в test.c из other.c.
Могу я extern
function1
называть это? Кроме того, я должен использовать extern
в function2
а также function3
которые называются function1
?
other.c
extern function1();
function1();
test.c
void function1()
{
function2();
function3();
}
void function2()
{
}
void function3()
{
}
4 ответа
На самом деле каждая функция по умолчанию является extern:) - если вы не объявите, что она не:). Достаточно, если у вас есть прототип перед первым вызовом;
int xxx(int, int, float, double); // prototype
int main(void)
{
int x,y;
float z;
double v;
xxx(x,y,z,v);
return 0;
}
Функция может быть в другом.c файле. Вам необходимо включить объектный файл в ссылку.
int xxx(int a, int b, float c, double d)
{
int result;
/* do something */
return result;
}
Объявления функций "по умолчанию" extern
,
квотирование C11
Глава §6.2.2, (выделение мое)
Если объявление идентификатора для функции не имеет спецификатора класса хранения, его связь определяется точно так же, как если бы она была объявлена с помощью спецификатора класса хранения
extern
, [...]
Таким образом, вам не нужно быть откровенным об этом.
Вам необходимо скомпилировать единицы перевода, также называемые исходными файлами (в объектные файлы), а затем связать их вместе для создания исполняемого файла. Это должно сделать это.
extern
просто говорит нам, что это определено где-то еще. И вы используете его в файле, который вы пишете extern
, Но функции по умолчанию внешние. Так что вам не нужно быть откровенным об этом.
Ты используешь extern
объявлять символы, которые являются внешними по отношению к текущему модулю перевода (примерно один исходный файл со всеми включенными заголовочными файлами).
Простой пример
Первый исходный файл test1.c
extern void function1(void); // "Import" a function from another translation unit
int main(void)
{
function1(); // Can call the declared function
}
Тогда второй исходный файл test2.c
:
void function2(void)
{
// Do something
}
void function1(void)
{
function2(); // No extern needed, it's declared (and defined)
// in the same translation unit
}
Как вы можете увидеть функцию function2
не нужно никаких extern
декларация где угодно. Используется только в test2.c
так только function1
нужно знать об этом.
Однако в test1.c
main
функция должна знать о function1
потому что он вызывается, тогда мы делаем предварительное объявление прототипа функции. Это делается с помощью extern
ключевое слово. Но для объявления функций extern
Ключевое слово на самом деле не нужно, так как они всегда считаются "внешними" (как отметил Питер).