Необъяснимая работа #include в VisualStudio

я использую VisualStudio 2017, но думаю на 2022 ситуация будет та же. Проблема в следующем. Есть файл include.h в котором находятся все остальные дерективы #include, подключается он в main.cpp. Внутри include.h находятся следующие строки

// тут подключаются библиотеки: OpenGL Imgui и множество других
...
// а дальше идут следующие файлы
#include "Lister.cpp"
#include "Game.cpp"
#include "GameLoop.cpp"
#include "Context.cpp"
#include "ContextLoop.cpp"

Все эти файлы я создавал одним и тем же образом, мышью выбирал "добавить новый элемент" в окне "обозреватель решений". Файлы находятся в корневой папке с main.cpp. Проблема в том, что некоторые файлы, например ContextLoop.cpp, не видят имён, объявленных ранее, таких как классы, прототипы функций, пространств и прочего. Т.е. я беру один и тот же код и вставляю по очереди в Context.cpp а затем в ContextLoop.cpp, в первом случае всё работает, во втором нет, причём IDE не жалуется на то, что какой-то из файлов не удалось подключить. Я всегда воспринимал #include как описано на официальном сайте microsoft: введите сюда описание изображения Т.е. на место использования дерективы подставляется полное содержание включаемого файла, ну с некоторыми особенностями работы #pragma once и другими файлозависимыми директивами.

Но как оказалось, есть что-то ещё, что определяет область видимости внутри включаемого файла. P.S. если определить в ContextLoop.cpp, файле, в котором ничего не видно, любую переменную, то из main.cpp и include.h её будет видно, когда как переменной из include.h внутри ContextLoop.cpp видно не будет, но в других файлах видно будет. Есть догадка, что это как-то зависит от .vcxproj файлов проекта.


Ответы (1 шт):

Автор решения: ATtiny13a -PU

Проблема заключалась в порядке записи включаемых файлов внутри .vcxproj и .vcxproj.filters, который зависел от порядка действий над файлами в момент создания/добавления внутри проекта из IDE. Ручное исправление порядка текстовым редактором устраняло проблему. Чтобы избежать этой ошибки, можно

  1. использовать функции рефакторинга самой VisualStudio, она создаст гарантированно рабочие пары header source в который можно будет также автоматически перенести существующий код.
  2. включить корневой каталог в список глобальных дополнительных каталогов и подключать файлы через include <>, что исключит влияние .vcxproj, т.к. файл станет внешним.
  3. (плохое решение) удалить/исключить все файлы проекта, а после добавить их в порядке вызовов include, что пересоздаст список внутри .vcxproj в верном порядке.
  4. отказаться от системы сборки MSBuild и использовать Cmake
→ Ссылка