Необъяснимая работа #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 шт):
Проблема заключалась в порядке записи включаемых файлов внутри .vcxproj и .vcxproj.filters, который зависел от порядка действий над файлами в момент создания/добавления внутри проекта из IDE. Ручное исправление порядка текстовым редактором устраняло проблему.
Чтобы избежать этой ошибки, можно
- использовать функции рефакторинга самой VisualStudio, она создаст гарантированно рабочие пары header source в который можно будет также автоматически перенести существующий код.
- включить корневой каталог в список глобальных дополнительных каталогов и подключать файлы через
include <>, что исключит влияние.vcxproj, т.к. файл станет внешним. - (плохое решение) удалить/исключить все файлы проекта, а после добавить их в порядке вызовов
include, что пересоздаст список внутри.vcxprojв верном порядке. - отказаться от системы сборки MSBuild и использовать Cmake