Как создать заголовок, подобный заголовку стандартной библиотеки, чтобы программа могла быть скомпилирована без привязки всех объектных файлов функций в заголовке? - PullRequest
0 голосов
/ 10 мая 2018

Пытаюсь создать заголовочный файл, который можно включить как #include "sort.h "
и программа, в которую включен заголовок, может быть скомпилирована нормально
g++ main.cpp
без необходимости связывать каждый отдельный объектный файл функций в заголовке с основным.

g++ -c main.cpp insertion_sort.cpp merge_sort.cpp


g++ main.o merge_sort.o insertion_sort.o

поэтому мне нужно связать каждый объектный файл для каждой функции в заголовке. или это другой путь?
заголовочный файл:

//sort.h file
#ifndef sort_h
#define sort_h

    void insertion_sort(int *a,int n);
    void merge_sort(int *a,int n);

    //I want to include more functions

    #endif

Как использовать мой заголовок как обычный заголовок, такой как cmath или stdlib.h?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете написать шаблонные функции, полностью состоящие из заголовочных файлов. Тогда вам не нужны никакие файлы .cpp и вам не нужно ссылаться на объектные файлы. Хотя это не является прямым решением заданного вопроса, это способ «не связывать каждый объектный файл для каждой функции».

Собираем все вместе

Если мы приведем пример, вы можете попробовать изменить свой файл sort.h следующим образом

//sort.h file
#ifndef sort_h
#define sort_h

    template <typename T>
    void insertion_sort(T* a,int n) {
        // insertion sort implementation goes here
    }

    template <typename T>
    void merge_sort(T* a,int n) {
        // merge sort implementation goes here
    }

#endif

Когда вы пишете здесь свои процедуры сортировки в качестве шаблонных функций, ваша функция должна быть достаточно универсальной, чтобы ее можно было использовать для универсальных T-типов. В общем случае для процедур сортировки T должно быть меньше, чем сопоставимо.

Отдельный интерфейс и реализация

Если вам не нравится размещать документацию, интерфейс и реализацию в одном месте, вы можете сначала объявить функцию вместе с ее документацией. Затем вы можете определить его ниже или, возможно, в каком-то другом файле. Итак, возможно следующее:

//sort.h file
#ifndef sort_h
#define sort_h

    /**
     *  Function documentation
     */
    template <typename T>
    void insertion_sort(T* a,int n);

    /**
     *  Function documentation
     */
    template <typename T>
    void merge_sort(T* a,int n);


#include "insertion_sort.h"
#include "merge_sort.h"
#endif

//insertion_sort.h file
#ifndef insertion_sort_h
#define insertion_sort_h

    template <typename T>
    void insertion_sort(T* a, int n) {
        // insertion sort implementation goes here
    }

#endif

//merge_sort.h file
#ifndef merge_sort_h
#define merge_sort_h

    template <typename T>
    void merge_sort(T* a, int n) {
        // merge sort implementation goes here
    }

#endif

Некоторые люди любят называть файлы реализации заголовков шаблонов .tpp файлами. Это зависит от ваших предпочтений.

Использование From main.cpp

Вы можете использовать первый или второй параметры из main.cpp следующим образом:

//main.cpp
#include "sort.h"
#include <vector>

int main() {
    std::vector<int> vec_int;
    // fill vector

    insertion_sort(&vec_int[0], vec_int.size());

    std::vector<double> vec_double;
    // fill vector

    merge_sort(&vec_double[0], vec_double.size());
}

1028 * Компиляция * Поскольку мы не использовали никаких файлов cpp, теперь компиляция main.cpp должна быть такой простой, как g++ -Wall -Wextra -g main.cpp при условии, что main.cpp и наши заголовочные файлы находятся в одном каталоге. Если заголовочные файлы находятся в некотором каталоге с именем include, то мы компилируем с g++ -Wall -Wextra -g -Iinclude main.cpp

0 голосов
/ 10 мая 2018

Похоже, у вас сложилось впечатление, что вещи, которые вы получаете из стандартных библиотечных заголовков, не имеют соответствующих объектных файлов / библиотечных файлов, с которыми необходимо связать. Это неправильно.

Стандартная библиотека связана с вашим приложением, просто компилятор делает это автоматически за вас. Вам не нужно указывать это вручную, чтобы сделать это.

Вашему приложению также нужна стандартная библиотека, доступная для запуска . Вот почему вы должны установить распространяемые файлы Microsoft на компьютере, на котором вы хотите запустить программу, созданную, например, с помощью Visual Studio. Другие компиляторы предъявляют аналогичные требования, необходимые для распространения их библиотек времени выполнения вместе с вашим приложением.

Короче говоря; стандартная библиотека ничем не отличается от других библиотек, за исключением того факта, что компилятор связывает ее для вас за кулисами.

...