Я новичок в концепции extern. Сегодня на работе я столкнулся с большим количеством внешних функций, которые были объявлены внутри заголовочного файла; фу.ч. Где-то в беспорядке папок я нашел файл foo.c, который содержал определение указанных функций, но он не #include foo.h
. Вернувшись домой, я решил поиграться с примерами класса внешнего хранилища. После некоторого чтения в "Книге C" это то, что я придумал.
Вот то, что я НЕ ожидал, чтобы работать. Но это произошло.
main.c
#include <stdio.h>
int data;
int main()
{
data = 6;
printf("%d\n", getData());
data = 8;
printf("%d\n", getData());
return 0;
}
externs.c
int getData()
{
extern int data;
return data;
}
баш
gcc main.c externs.c -o externs
Я не думал, что это сработает, потому что функция технически (или, по крайней мере, подробно) не определена перед main. Это работает, потому что класс хранения по умолчанию для int getData()
— extern
? Если да, то зачем вообще заморачиваться со следующим примером (похожим на то, что я видел на работе)?
main2.c
#include <stdio.h>
#include "externs.h"
int data;
int main()
{
data = 6;
printf("%d\n", getData());
data = 8;
printf("%d\n", getData());
return 0;
}
externs.h
#ifndef _EXTERNSH_
#define _EXTERNSH_
extern int getData();
#endif
externs.c
int getData()
{
extern int data;
return data;
}
баш
gcc main2.c externs.c -o externs