Aviso do compilador (nível 4, desativado) C4464

o caminho de inclusão relativo contém '..'

Uma diretiva #include tem um caminho que inclui um especificador de diretório pai (um segmento de caminho ..).

Comentários

No Visual Studio 2015 Atualização 1 e versões posteriores, se estiver habilitado, o compilador poderá detectar e emitir um aviso para uma diretiva #include que contém um segmento de caminho de diretório pai (..). Às vezes, o código é escrito com o uso de caminhos relativos de diretório pai para incluir cabeçalhos de bibliotecas externas. Quando esses caminhos de cabeçalho relativos ao diretório pai são especificados em arquivos de origem, ele cria um risco: o programa pode ser compilado com a inclusão de um arquivo de cabeçalho diferente do que o programador pretendia. Talvez esses caminhos relativos não sejam portáteis para os ambientes de build de outros desenvolvedores.

Em vez disso, recomendamos que você especifique os caminhos para esses cabeçalhos no ambiente de build, como na variável de ambiente INCLUDE ou em parâmetros para a opção do compilador /I (diretórios de inclusão adicionais). No IDE do Visual Studio, você pode definir os caminhos na página de propriedades Propriedades de Configuração>C/C++>Geral do projeto, na propriedade Diretórios de Inclusão Adicionais. Embora não haja nenhum aviso específico para isso, também não recomendamos o uso de segmentos de caminho de diretório pai ao especificar os diretórios de inclusão do seu projeto.

O aviso C4464 é novo no Visual Studio 2015 Atualização 1 e está desativado por padrão. Use /Wall para habilitar todos os avisos desativados por padrão. Use /wN4464 para habilitar o C4464 como um aviso de nível N (em que N é 1 a 4). Para obter mais informações, confira Avisos do compilador desativados por padrão. Para obter informações sobre como desabilitar avisos introduzidos em uma versão específica do compilador ou uma versão posterior, confira Avisos do compilador por versão do compilador.

Exemplo

Arquivos de código-fonte que usam segmentos de caminho .. em diretivas #includepodem disparar esse aviso quando o C4464 está habilitado ou quando a opção /Wall é especificada.

Neste exemplo, a origem do projeto está em C:\project\source e os arquivos de cabeçalho de uma biblioteca externa estão em 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
// . . .

Para corrigir esse problema, adicione o caminho C:\other_lib\headers aos diretórios de inclusão do projeto. Em seguida, altere a origem para incluir os arquivos de cabeçalho como cabeçalhos externos:

// 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
// . . .