Область видимости файла и прототипы функций
У нас есть 2 файла main.cpp и lib.cpp. В первом у нас лежит, какой нибудь код, а во втором определение некоторой функции. Так вот, насколько я понимаю у каждого из этих файлов своя область видимости, тоесть если мы определим переменную в lib.cpp, то работать с ней в main.cpp не получится. Аналогично и с функцией которая лежит в lib.cpp, без объявления прототипа ее вызвать не получится. Так вот, как работает прототип? Получается он даёт команду компилятору о том, что бы искать данное имя где-то в коде (например в другом файле) и таким образом он грубо говоря "ломает" (разрешает) эти области видимости? И имеет ли файл свою область видимости?
Ответы (1 шт):
Давайте все же разделять чисто компиляцию и компоновку.
Примерно так. Прототип говорит компилятору - где-то - не твое дело, где - будет функция void f(int) (ну, или какой там у вас прототип). Все. Действуй так, как будто она есть.
OK, говорит компилятор, и в нужном месте вставляет команду типа
CALL f@int ; ну, или как он ее там обзовет
В машинном коде, грубо говоря, остается место для адреса, а в какой-то таблице записывается - в таком-то месте надо подставить правильный адрес.
В библиотечном файле компиляция выполняется полностью, и есть где-то что-то вроде
PROC f@int
Когда компоновщик берется за дело, он, грубо говоря, сводит воедино таблицы мест, куда надо подставить верный адрес, и таблицы имен с адресами, и заполняет нужные места адресами (на самом деле, не совсем адресами, сами адреса будут подставляться уже во время загрузки для выполнения, но это уже детали. Важно, что больше не останется никаких записей "вот тут не знаю, откуда брать эту функцию/переменную, разберитесь потом".)
Упрощенно - примерно так. Многие конкретные детали зависят от операционки, компилятора, режима работы процессора и прочего, но смысл примерно такой.
Область видимости - это понятие времени компиляции, а разрешение связей происходит при компоновке. Так что прототип как раз скорее дает команду компилятору НЕ искать данное имя где-то в коде ("байт даю, потом это имя будет!")...