include — модель компиляции включения в Stack Overflow

/*--------------------utilities.h-------------------------------------*/

#ifndef UTILITIES_H
#define UTILITIES_H

template<class T> int compare(const T&,const T&);

#include<utilities.cpp>
#endif

/*--------------------utilities.cpp-------------------------------------*/

template<class T> int compare(const T &v1 , const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}

/*--------------------main.cpp------------------------------------------*/

#include<iostream>
#include<utilities.h>
using namespace std;

int main(int argc , char *argv[])
{
cout << compare(1,2) << endl;

return 0;
}

Код выше является примером из книги. Однако, это дает ошибки, когда я компилирую три файла:

utilities.h:6:24: fatal error: utilities.cpp: No such file or directory
compilation terminated.
main.cpp:2:22: fatal error: utilities.h: No such file or directory
compilation terminated.

Я не знаю, почему я получаю «Нет такого файла или каталога»!

0

Решение

Проблема 1

Когда вы пишете:

#include <utilities.h>

Компилятор ищет utilities.h по умолчанию включают пути или пути, которые указаны явно (например, в g ++ с -I).

Ты можешь написать:

#include "utilities.h"

чтобы он сначала посмотрел на путь относительно исходного файла.

Проблема 2

Вы включили utilities.cpp в заголовочном файле (также с той же проблемой, что и выше). Это не рекомендуется, но не строго неправильно. Однако в этом случае содержимое этого файла уже скомпилировано и включено в main.oТаким образом, вам на самом деле не нужно компилировать и связывать два объектных файла, но только main.cpp достаточно.

Рекомендуемый подход к написанию шаблонов — записать все в заголовочный файл (я знаю, это нехорошо):

/*--------------------utilities.h-------------------------------------*/

#ifndef UTILITIES_H
#define UTILITIES_H

template<class T>
static inline int compare(const T &v1, const T &v2);
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}

#endif

/*--------------------main.cpp------------------------------------------*/

#include <iostream>
#include "utilities.h"
using namespace std;

int main(int argc , char *argv[])
{
cout << compare(1,2) << endl;

return 0;
}

Вы просто компилируете main.cpp,

2

Другие решения

Книга не дает вам содержимое одного файла, она дает вам содержимое нескольких. Когда в списке говорится

/*--------------------utilities.cpp-------------------------------------*/

авторы имеют в виду «Поместите следующий код в файл» utilities.cpp «. Похоже, у вас нет этого файла. Сделайте это, и все это будет компилироваться.

1

Было ли это в книге или нет, в коде есть ошибка. Это
должно быть

#include "utilities.cpp"

а также

#include "utilities.h"

Обычно, когда вы используете <...> Форма включения, компилятор
не будет искать файл в текущем каталоге. (Обычно вы можете
скажи это сделать, с опцией по линии /I. или же -I., но
использование правильной формы включения является предпочтительным.)

1

+ Изменить

#include<utilities.cpp>

в

#include "utilities.cpp"

а также

#include<utilities.h>

в

#include "utilities.h"

Включение с <> предназначен для «системных» заголовков. Я также предлагаю вам переименовать utilities.cpp в utilities.ipp, чтобы отличать исходные файлы, которые включены от тех, которые скомпилированы напрямую.

1