C++在#include指令中使用..(点点)是否合法?

Cae*_*sar 3 c++ include include-path

那里.正如标题所说.

使用#include"test.h"是合法的.
使用#include"test/test.h"也是合法的.
但使用合法#include"../test.h"吗?

例如,#pragma once几乎每个编译器都是合法的.
但这不是C++的标准.

我找不到任何说"保证"是父目录含义的文件.
谁能帮我?

Chr*_*ckl 6

C++标准在§2.8/ 1中说:

标题名称预处理标记只能出现在#include 预处理指令(16.2)中.两种形式的头名称中的序列以实现定义的方式映射到头部或外部源文件名,如16.2中所指定.

所以在这里你拥有它:它是所有实现定义的.然后§16.2说,在与你的问题没有直接关系的其他一些事情中:

表单的预处理指令

#include "q-char-sequence " new-line

导致由" 分隔符之间的指定序列标识的源文件的全部内容替换该指令.以实现定义的方式搜索指定的源文件.

这很有道理.为什么不能为不使用".."约定的文件系统创建C++编译器?

总而言之,回答你的问题:是的,根据C++标准它是合法的,但这并不奇怪,因为几乎所有东西在技术上都是合法的#include指令.

更有趣的问题是C++实现的文档对此有何看法.但即便如此,您可能会对该主题留下相当通用的解释.例如,MSVC 2015文档#include说:

路径规格是可任选地被一个目录说明书前面的文件名.文件名必须命名现有文件.path-spec 的语法取决于编译程序的操作系统.