Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Воспользоваться функцией из другого cpp/h файла

#cpp


Подскажите как объявить, и в последующем обратиться к функции в другом файле
    


Ответы

Ответ 1



Во-первых, в .h-файлах нет никаких функций. Это просто кусок текста, вставляемый перед компиляцией вместо соответствующих директив #include. Соответственно, с точки зрения компилятора нет никакой разницы, включили ли вы заголовочный файл или просто взяли и скопировали его содержимое в свой .cpp руками. То есть для решения вашей задачи нет разницы между заголовочным файлом с объявлением функции: decl.h: #pragma once void foo(int bar); main.cpp: #include "decl.h" int main() { foo(21); // Использование функции } implementation.cpp: #include "decl.h" void foo(int bar) { // Реализация функции } и повтором объявления в каждом .cpp-файле, которому нужна эта функция: main.cpp: void foo(int bar); int main() { foo(21); // Использование функции } implementation.cpp: void foo(int bar) { // Реализация функции } Во-вторых, .cpp-файл — это «вещь в себе», чёрный ящик с двоичными данными и списком того, что этот ящик импортирует/экспортирует, и по каким байтовым смещениям в вышеуказанных данных это требуется/реализуется соответственно: Если в .cpp-файле производится обращение к чему-то, нереализованному в этом файле, и у компилятора есть объявление (то есть прототип для проверки корректности обращения), генерируется импорт этого чего-то по имени. Если в .cpp-файле объявляется не-static переменная либо функция (методы классов, кстати, тоже полноценные функции), генерируется экспорт. И только потом, на этапе компоновки производится связывание соответствующих импортов и экспортов этих «чёрных ящиков» (а также подобных «ящиков», составляющих реализацию стандартной библиотеки).

Ответ 2



Общий принцип - объявление (void sort_mass(int*, int);) должно быть доступно в момент использования для успешной компиляции (поэтому их обычно располагают в заголовочных файлах, включаемых в другие файлы. Определение (тело функции) необходимо во время компоновки, и должно быть (если это не inline или static функция) единственным в программе. Поэтому, если оно находится в отдельном файле, этот файл должен быть скомпилирован и скомпонован с основной программой (включен в проект). Такой файл может включаться в уже скомпилированном виде (как объектный файл или в составе библиотеки).

Комментариев нет:

Отправить комментарий