@ProCxx

Страница 88 из 2477
Andrei
16.04.2016
22:51:26
Тогда тебе надо будет объявить переменные и функции extern

Ned Ogl
16.04.2016
22:52:30
Ты можешь не подключать заголовочник
Тогда почему, чтобы воспользоваться printf(), нужен инклуд stdio?

Andrei
16.04.2016
22:54:17
Потому что он там объявлен лол.

Смотри.

Google
Andrei
16.04.2016
22:54:23
Ща

Что я имею в виду

Допустим у тебя есть файл a.cpp

Вот с таким содержанием:

int a = 10;

И файл main.cpp

С таким содержанием:

extern int a; int main(){ std::cout<<a; return 0;}

Если бы ты убрал слово extern

То код бы вывел 0

А так он выведет 10

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

Память под неё выделена в другом месте.

Google
Ned Ogl
16.04.2016
22:57:57
окей

тогда я все равно не понимаю

есть a.cpp и b.cpp

в a.cpp лежит: int func() {return 10;}

в b.cpp int func(); int main() {cout << func(); return 0;}

и тоже никаких проблем

Andrei
16.04.2016
23:00:54
Да

Потому что функции всегда по дефолту и так имеют внешнюю линковку

Ned Ogl
16.04.2016
23:01:27
Ну опять же. Нахуй тогда extern?

Andrei
16.04.2016
23:01:31
Но можно сделать её внутренней клбчевым словом static или помещением в анонимный неймспейс.

В смысле? Extern для переменных.

Ned Ogl
16.04.2016
23:02:42


авто stdio.h тоже так считает)

Andrei
16.04.2016
23:03:02
Блин

Я понял

Тут в другом делом

Тут дело в том, как линкеру искать зависимости.

Смотри.

Ned Ogl
16.04.2016
23:04:08
Да, я тут, слушаю внимательно

Andrei
16.04.2016
23:05:07
Дело в порядке объявления функций.

Google
Andrei
16.04.2016
23:06:03
Как я уже сказал есть слово static

extern будучи объявлен после static не имеет никакого эффекта

Просто extern излишен

Но вот объявленная static функция после объявления extern вызовет ошибку линковщика

То есть если мы где-то объфвили функцию как extern

Далее мы уже не можем её переобпределить

Но вообще никакого смысла использовать extern с функциями нет.

Это делается по историческим причинам. Привычка.

Просто явное указание читающему код что функция реализована где-то еще а не здесь.

Ned Ogl
16.04.2016
23:11:07
Объясни, плз, разницу внешней и внутренней линковки

Andrei
16.04.2016
23:11:20
Там есть еще второе значение extern но это уже про inline

Эм. Ну смотри.

Andrei
16.04.2016
23:11:41
Компилятор делает тебе объектные файлы.

Объектные файлы содержат функции и переменные.

Если например у тебя есть переменная или функция в одном файле которая сслыается на переменную или функцию из того же файла то это внутренняя линковка

Если она ссылается на функцию или переменную которая определена в другом файле то это внешняя.

Вот и все

Ты разницу между объявлением и определением понимаешь?

Ned Ogl
16.04.2016
23:14:11
то есть если функция объявлена в cpp static, то извне её уже не вызовешь?

Andrei
16.04.2016
23:14:20
Да.

Google
Andrei
16.04.2016
23:14:26
Линкер её не найдет.

Ned Ogl
16.04.2016
23:14:27
из другого срр даже если их слинковать вместе?

Andrei
16.04.2016
23:14:34
Да.

Потому что помеченные static функции не выносятся в таблицу экспорта.

Которую просматривает линкер

Ned Ogl
16.04.2016
23:15:00
почему бы тогда не static int main()?

Andrei
16.04.2016
23:15:20
Можешь так написать.

Все будет ок.

Ned Ogl
16.04.2016
23:15:26
хотя как тогда её вызовет система?

а хотя нормально

Admin
ERROR: S client not available

Ned Ogl
16.04.2016
23:15:42
точкой входа-то она останется

Andrei
16.04.2016
23:15:47
Только хотя бы в одном файле должно быть не static main

Не останется. Линкер не поймет.

Хотя бы в одном файле должна быть int main без слова static

Линкер это и есть то, что делает main точкой входа.

(Не совсем так но понимать можно именно так)

Ned Ogl
16.04.2016
23:16:45
ну есть ещё какая-то ф-я __start

ее линкер и вытаскивает как точку входа

или нечто в этом роде

Google
Andrei
16.04.2016
23:17:09
Ну да. Там еще генерируется вокруг обычно некий код.

Инициализационный/деинициализационный

Ned Ogl
16.04.2016
23:17:29
ну да, он обрамляет это всё

Andrei
16.04.2016
23:17:45
Ага. Но внутри этой ___start есть вызов main

Которую линкер попытается найти.

Ned Ogl
16.04.2016
23:17:58
дада, это я где-то читал

как тогда понять extern "C" {...}?

Andrei
16.04.2016
23:19:10
А. Это совсем другое

Это связано с экспортом.

Смотри.

Ned Ogl
16.04.2016
23:19:46
блять

ща кто-т запутается к чертям и это буду я

ну ладно

Andrei
16.04.2016
23:20:20
Вот ты написал в сишном файле функцию int foo(void);

А потом в другом файле ее заюзал

Как эта магия работает?

Ned Ogl
16.04.2016
23:20:47
линкер нашел, залинковал

статически, кстати, походу

Andrei
16.04.2016
23:20:54
Когда компилятор компилирует первый файл в объектник

Он пишет таблицу

Stanislav
16.04.2016
23:21:04
давай уже про манглинг и ABI :)

Andrei
16.04.2016
23:21:10
Таблицу экспорта

Страница 88 из 2477