extern?
Или inline (since C++ 17). Затем, чтобы избежать ODR (One Definition Rule) violation. Правила одного определения, которое гласит что объявлений может быть множество, а определение лишь одно. Когда ты пишешь extern int foo; ты не создаёшь объект типа int. Ты говоришь компилятору (объявляешь), что такой объект где-то существует. После этого надо определить int foo в .c/cpp/cxx файле, чтобы компилятор сгенерировал код, который выделит ресурс под объект(память) и создаст его.
Я про extern, причем в объявлении (declaration) именно функции. Причем, в Си.
Не видел про функции. В плюсах могло быть явная инстанция специализации шаблона (extern template). В си же, extern для объявлений функции не нужен.
Он нужен для того, чтобы линкер понимал, что эта функция/переменная из внешнего модуля. Т.е. если у тебя есть void foo(void) { foo1(); } И foo1 нигде не объявленна в подключенных заголовках - при сборке тебя пошлет, до тех пор, пока ты не добавишь include с заголовком функции в область видимости этого файла или не напишешь вот так extern void foo1(void); void foo(void) { ... foo1(); ... } Ну или прямо над вызовом void foo(void) { ... extern void foo1(void); foo1(); ... } При этом эта функция должна быть где-то имплементирована и не объявлена как static
А разве просто объявить void foo1(void); в h файле недостаточно для С?
В моем сообщении ключевое слово или Любой из этих вариантов сработает
Ну тогда зачем писать extern если можно не писать?
extern для функции нужен только в одном случае, если по какой-то причине не подключен заголовочник с заголовком функции. Почему так произошло, это отдельный вопрос.
extern void foo(); vs void foo(); Я про то что нет разницы, ведь так?
Да в целом нет, пока не встретится вариант, что тебе нужно из функции дёрнуть функцию из другого модуля, которая не static и почему то ее нет в заголовочник или самого заголовочника нет. Тогда только с extern
cat a.h #pragma once int foo(); // end a.h cat a.c #include "a.h" int foo(){} // end a.c cat b.c void bar(){ int foo(); foo(); } int _start(){} // end b.c # /usr/bin/arm-none-eabi-gcc a.c b.c -nostdlib -std=c99 -Werror -Wpedantic Всё работает и без extern.
А ты убери #include "a.h"
В b.c его и нет.
Просто так.
Прагма? Специфик для микрософта
Нет. Это расширение реализованно почти во всех компиляторах.
И при множественных инклудах даже работает быстрее.
Обсуждают сегодня