Должны ли заголовки в скобках всегда быть выше заголовков в кавычках для C ++? - PullRequest
0 голосов
/ 26 октября 2018

При компиляции исходного файла C ++, если у вас есть несколько заголовков, состоящих из заголовков в скобках и в кавычках, всегда ли заголовки в скобках должны всегда указываться первыми?

Я помещаю заголовок в кавычках перед заголовком в скобках, и этоначал давать мне переопределение ошибок компилятора.

Файл заголовка (utilities.h):

#ifndef _UTILITIES_H
#define _UTILITIES_H

#include <vector>
double calcNorm(std::vector <double> array);   //template?

#endif

Исходный файл (utilities.cpp):

#include <math.h>
#include <vector>
#include "utilities.h"

double calcNorm(std::vector <double> array)   //template?
{
   int n;
   double norm = 0;

   n = array.size();
   for (int i = 0; i < n; i++)
   {
      norm += array[i]*array[i];
   }

   norm = sqrt(norm);

   return norm;
}

Ранее в исходном файлеУ меня было #include "utilities.h" над заголовками в скобках, и я получал следующую ошибку компилятора:

g++ -g -Wall -c utilities.cpp
utilities.cpp: In function ‘double calcNorm(std::vector<double>)’:
utilities.cpp:5:8: error: redefinition of ‘double calcNorm(std::vector<double>)’
 double calcNorm(std::vector <double> array)   //template?
        ^
utilities.h:3:8: note: ‘double calcNorm(std::vector<double>)’ previously defined here
makefile:12: recipe for target 'utilities.o' failed

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Краткий ответ: Нет.

Длинный ответ: Директива #include почти буквально вставляет содержимое этого файла в источник. Заголовок должен быть включен, прежде чем какая-либо его функциональность будет использоваться. Период. Если вы добавите iostream в конце, но не используете этот заголовок, проблем не будет

0 голосов
/ 26 октября 2018

Нет.Единственная разница между заголовками, заключенными в угловые скобки, и заголовками, заключенными в кавычки, заключается в том, где система будет их искать.(Обратите внимание, что стандартные заголовки могут вообще не существовать как отдельные файлы; это деталь реализации, о которой вам не нужно беспокоиться.)

0 голосов
/ 26 октября 2018

При компиляции исходного файла C ++, если у вас есть несколько заголовков, состоящих из заголовков в скобках и в кавычках, должны ли заголовки в скобках всегда указываться первыми?

Нет.

Заголовочные файлы (как внутри исходных файлов, так и внутри других заголовочных файлов) могут быть в любом порядке.Фактически, заголовочный файл даже не нужно включать в начало исходного файла, если каждый заголовочный файл находится перед любыми объявлениями, которые зависят от объявлений из заголовка.Независимо от того, был ли путь задан в угловых скобках или в двойных кавычках, это не имеет значения.

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


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

Хммм.Я думаю, что нашел проблему.У меня был этот двоичный файл с именем utilities.h.gch (не уверен, откуда он) в каталоге.Я удалил его, и проблема с компилятором исчезла.

Ах.gch - это расширение файла, используемое предварительно скомпилированными заголовками, и это объясняет, почему вашего примера недостаточно для воспроизведения вашей проблемы.Подробнее о поведении предварительно скомпилированных заголовков см. В руководстве к вашему компилятору.

0 голосов
/ 26 октября 2018

«сделать заголовки в квадратных скобках всегда должны быть перечислены первыми» - Нет.

Это не имеет ничего общего с порядком включений, и все, что связано с правилами поиска включений.Оператор include, такой как #include "foo.h", заставит препроцессор сначала искать в текущем каталоге исходного файла, , а затем в любых указанных вами путях включения (и путях по умолчанию).Оператор включения, такой как #include <foo.h>, будет делать то же самое, за исключением того, что он пропустит начальный шаг "посмотреть в текущем каталоге".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...