189 похожих чатов

Знатоки, расскажите мне, зачем в хидерах все объявления функций сделаны

extern?

17 ответов

12 просмотров

Или inline (since C++ 17). Затем, чтобы избежать ODR (One Definition Rule) violation. Правила одного определения, которое гласит что объявлений может быть множество, а определение лишь одно. Когда ты пишешь extern int foo; ты не создаёшь объект типа int. Ты говоришь компилятору (объявляешь), что такой объект где-то существует. После этого надо определить int foo в .c/cpp/cxx файле, чтобы компилятор сгенерировал код, который выделит ресурс под объект(память) и создаст его.

Alexey-Tsvetkov Автор вопроса
Wild_Wind
Или inline (since C++ 17). Затем, чтобы избежать O...

Я про extern, причем в объявлении (declaration) именно функции. Причем, в Си.

Alexey Tsvetkov
Я про extern, причем в объявлении (declaration) им...

Не видел про функции. В плюсах могло быть явная инстанция специализации шаблона (extern template). В си же, extern для объявлений функции не нужен.

Wild_Wind
Не видел про функции. В плюсах могло быть явная ин...

Он нужен для того, чтобы линкер понимал, что эта функция/переменная из внешнего модуля. Т.е. если у тебя есть void foo(void) { foo1(); } И foo1 нигде не объявленна в подключенных заголовках - при сборке тебя пошлет, до тех пор, пока ты не добавишь include с заголовком функции в область видимости этого файла или не напишешь вот так extern void foo1(void); void foo(void) { ... foo1(); ... } Ну или прямо над вызовом void foo(void) { ... extern void foo1(void); foo1(); ... } При этом эта функция должна быть где-то имплементирована и не объявлена как static

Leonid Zaliubovskyi
Он нужен для того, чтобы линкер понимал, что эта ф...

А разве просто объявить void foo1(void); в h файле недостаточно для С?

Wild_Wind
А разве просто объявить void foo1(void); в h файле...

В моем сообщении ключевое слово или Любой из этих вариантов сработает

Leonid Zaliubovskyi
В моем сообщении ключевое слово или Любой из этих...

Ну тогда зачем писать extern если можно не писать?

Wild_Wind
Ну тогда зачем писать extern если можно не писать?

extern для функции нужен только в одном случае, если по какой-то причине не подключен заголовочник с заголовком функции. Почему так произошло, это отдельный вопрос.

Leonid Zaliubovskyi
extern для функции нужен только в одном случае, ес...

extern void foo(); vs void foo(); Я про то что нет разницы, ведь так?

Wild_Wind
extern void foo(); vs void foo(); Я про то что нет...

Да в целом нет, пока не встретится вариант, что тебе нужно из функции дёрнуть функцию из другого модуля, которая не static и почему то ее нет в заголовочник или самого заголовочника нет. Тогда только с extern

Leonid Zaliubovskyi
Да в целом нет, пока не встретится вариант, что те...

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.

Просто так.

Wild_Wind
cat a.h #pragma once int foo(); // end a.h cat a...

Прагма? Специфик для микрософта

linxuil
Прагма? Специфик для микрософта

Нет. Это расширение реализованно почти во всех компиляторах.

Wild_Wind
Нет. Это расширение реализованно почти во всех ком...

И при множественных инклудах даже работает быстрее.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта