Предупреждение компилятора (уровень 4, выключен) C4464
относительный путь включения содержит ".".
Директива #include
содержит путь, содержащий описатель родительского каталога ( ..
сегмент пути).
Замечания
В Visual Studio 2015 с обновлением 1 и более поздних версий компилятор может обнаруживать и выдавать предупреждение для #include
директивы, содержащей сегмент пути родительского каталога (..
). Иногда код записывается, использующий относительные пути родительского каталога для включения заголовков из внешних библиотек. Если эти пути заголовка относительно родительского каталога указываются в исходных файлах, он создает риск: программа может быть скомпилирована, включив другой файл заголовка, чем программист намерен. Эти относительные пути могут быть не переносимыми в другие среды сборки разработчиков.
Вместо этого рекомендуется указать пути к таким заголовкам в среде сборки, например INCLUDE
в переменной среды или в параметрах /I
для параметра компилятора (дополнительные каталоги включения). В интегрированной среде разработки Visual Studio можно задать пути на странице свойств>конфигурации проекта C/C++>General в свойстве "Дополнительные каталоги включения". Хотя для него нет определенного предупреждения, мы также не рекомендуем использовать сегменты пути родительского каталога при указании каталогов включаемых каталогов проекта.
Предупреждение C4464 новое в Visual Studio 2015 с обновлением 1 и по умолчанию отключено. Используйте /Wall
для включения всех предупреждений, отключенных по умолчанию. Используйте /wN4464
для включения C4464 в качестве предупреждения уровня N
(где N
— 1–4). Дополнительные сведения см. в разделе "Предупреждения компилятора", отключенные по умолчанию. Сведения об отключении предупреждений, введенных в определенной версии компилятора, см . в предупреждениях компилятора по версии компилятора.
Пример
Файлы исходного кода, использующие ..
сегменты пути в #include
директивах, могут активировать это предупреждение при включении C4464 или при указании /Wall
параметра.
В этом примере источник проекта находится в C:\project\source
файлах заголовков внешней библиотеки:C:\other_lib\headers
// C:\project\source\C4464.cpp
// Compile by using: cl /w14464 C4464.cpp
#include "..\..\other_lib\headers\other.h" // C4464
#include "..\..\other_lib\headers\extras\nested.h" // C4464
// . . .
Чтобы устранить эту проблему, добавьте путь C:\other_lib\headers
к каталогам включаемого проекта. Затем измените источник, чтобы включить файлы заголовков в качестве внешних заголовков:
// C:\project\source\C4464b.cpp
// Compile by using: cl /w14464 /I"C:\other_lib\headers" C4464b.cpp
#include <other.h> // OK
#include <extras\nested.h> // OK
// . . .