ключевое слово extern с именами функций - PullRequest
1 голос
/ 23 февраля 2011

Я знаю, что ключевое слово static делает функцию C / переменную областью файла.И я читал, что если я хочу создать переменную глобальную область видимости (доступ к которой осуществляется несколькими файлами), я должен сделать:

в файле .c:

int my_global_var;

// main()....

в файле .h:

extern int my_global_var;

Таким образом, любой из них будет включать мой .h файл, который сможет ссылаться на my_global_var, который уже extern ed.

ИЯ также прочитал, что это требуется и для функций, но я использую gcc 4.x, и я не extern, функция в файле .h и другие программы могут успешно link it.

Итак, вопрос в том ...

Является ли поведение связывания нестатических функций заданным по умолчанию или я должен extern нестатических функций придерживаться стандарта ??

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

от стандарта, 6.2.2

5 Если объявление идентификатора для функции не имеет класса хранения спецификатор, его связь определяется точно так, как если бы это было объявлено с спецификатор класса хранения extern. Если объявление идентификатора для у объекта есть область видимости файла и нет спецификатор класса хранения, его связь внешний.

Значение по умолчанию внешнее.

1 голос
/ 23 февраля 2011

И объявления функций, и объекты по умолчанию extern. Однако вам нужно добавить явное extern к объявлениям вашего объекта в заголовочных файлах, чтобы избежать повторного определения: без спецификатора класса хранения любое объявление объекта в области файла будет фактически называться предварительным определением и резервное хранилище для объекта в пределах текущей единицы перевода.

Для согласованности я без необходимости использую extern даже для объявлений функций. В большинстве случаев я объявляю объекты в заголовках как один из

extern int foo;
static const int bar = 42;

и функционирует как один из

extern int spam(void);
static inline int eggs(void) { return 42; }
...