Программа не находит заголовочный файл в моей рабочей области C ++ - PullRequest
0 голосов
/ 11 июня 2019

Я очень плохо знаком с программированием на C ++ и слежу за книгой по C ++ Primer 5th Edition.Существует упражнение, требующее объекта «Sales_item», который предоставляется в виде файла заголовка.Срок действия ссылки истек, поэтому я получил код от GitHub и сам сохранил его в виде файла заголовка (.h).Я использую Code :: Blocks IDE и сохранил файл Sales_item.h в том же каталоге, что и файл моего проекта.Когда я снова открыл проект, CodeBlocks автоматически создал папку «header» в рабочей области с файлом Sales_item внутри.Я добавил его в начало моего текущего проекта и скомпилировал, просто чтобы убедиться, что он работает:

#include <Sales_item.h>

, но он возвращает ошибку и не скомпилируется.

Тело программы на самом деле не кажется важным;на самом деле он ничего не делает, только для тестирования, компилируется и работает нормально, если я удалю заголовочный файл из рабочей области.Я попытался повторно загрузить код из GitHub по другому (надеюсь лучше) соединению в Uni и сохранить файл и переместить файл заголовка в разные места в папках bin и obj рабочей области.Сообщения об ошибках могут указывать на то, что я не использую C ++ 11?Я был под впечатлением, учитывая, что это была IDE, рекомендованная в видео от 2018 года, и книга предполагает, что код - C ++ 11.Я не совсем уверен, как проверить.Я уверен, что это простая проблема, которую я просто не знаю, как исправить.Сообщения об ошибках при компиляции включают '#include, а также указывают внутри самого файла Sales_item.h, и включают 3 ошибки и 3 предупреждения (включены ниже).

#include <iostream>
#include <Sales_item.h>

using namespace std;

int main()
{
    int num1 = 2;
    int num2 = 3;

    std::cout << num1 + num2 << std::endl;

    return 0;

}

||=== Build: Debug in C++PrimerWork (compiler: GNU GCC Compiler) ===|
Documents\C++ Projects\C++Primer\C++PrimerWork\main.cpp|2|fatal error: Sales_item.h: No such file or directory|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|56|warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|70|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|71|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|45|error: constructor required before non-static data member for 'Sales_item::units_sold' has been parsed|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|45|error: constructor required before non-static data member for 'Sales_item::revenue' has been parsed|
||=== Build failed: 3 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===|

Первая ошибка гласит, что такого файла, как Sales_item.h, не существует, хотя он был автоматически добавлен в рабочую область и открыт на собственной вкладке.Дальнейшие ошибки также указывают внутри самого файла (в частности, предупреждения).Две нижние ошибки - это то, что заставило меня думать, что оригинальная загрузка была каким-то образом повреждена.В связи с предупреждениями мне также интересно, ожидает ли компилятор другой версии C ++ или я делаю что-то не так, но понятия не имею.

Ответы [ 3 ]

1 голос
/ 11 июня 2019

Два варианта включения файла отличаются тем, где компилятор будет искать файл заголовка для включения.

На самом деле, пути для включения определены реализацией в обоих вариантах. Но стандарт гласит:

Директива предварительной обработки вида #include "q-char-sequence" new-line [...] если поиск не удался, директива перерабатывается, как если бы она читала #include <h-char-sequence> new-line [...].

Из этого следует, что вы можете включить любой заголовок с "", но не обязательно все из них с <>.

Обычно 'определенный реализацией' путь поиска содержит пути к заголовкам стандартной библиотеки (таким как cstdint, vector, ...) и те, которые вы явно указываете компилятору ( обычно через -I параметр командной строки - но это зависит от компилятора), тогда как "" обычно добавляет каталог, в котором находится файл для компиляции (то есть путь относительно файла, скомпилированного в данный момент).

Таким образом, вы можете включить такие пути, как:

#include "../include/myLibrary/SomeHeader.h"

, что может произойти, если вы поместите заголовки и исходные файлы в разные каталоги.

Довольно распространенным соглашением (то есть не обязанным стандартом) является включение стандартных заголовков и библиотек сторонних производителей, с которыми вы связываетесь с помощью <>, а также из вашего собственного проекта с помощью "".

0 голосов
/ 11 июня 2019

Использование #incude "Sales_item.h"

На практике разница заключается в том, где препроцессор ищет включенный файл.

Для #include <filename> препроцессор ищет в зависимости от реализации,обычно в каталогах поиска, предварительно обозначенных компилятором / IDE.Этот метод обычно используется для включения стандартных файлов заголовков библиотеки.

Для #include "filename" препроцессор сначала выполняет поиск в том же каталоге, что и файл, содержащий директиву, а затем следует пути поиска, используемому для формы #include.Этот метод обычно используется для включения файлов заголовков, определенных программистом.

0 голосов
/ 11 июня 2019

когда вы используете <> для включения файла заголовка, это означает, что файл находится в той же папке, что и другой файл стандартной библиотеки

#include <Sales_item.h>  
//it will look in the same folder that contains file like studio.h,string.h
   #include "Sales_item.h"   
//it will look in folder where the main cpp is stored so try "Sales_item.h"
//or add the path of Sales_item.h in your program properties
  • ищите Sales_item.cpp, должно бытьодин, потому что обычно заголовочные файлы имеют файл cpp с тем же именем, в котором определены функции
...