【问题标题】:C++ Is it legal to use .. (dot dot) in #include directive?C ++在#include指令中使用..(点点)是否合法?
【发布时间】:2016-01-09 10:31:17
【问题描述】:

那里。正如标题所说。

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

例如,#pragma once 在几乎所有编译器中都是合法的。
但这不是 C++ 的标准。

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

【问题讨论】:

  • 是的,它是合法的,但请确保每当您制作二进制文件时,二进制目录的父目录包含该 test.h 文件。
  • 像“../test.h”这样的相对路径是完全合法的。该路径将相对于您的“包含路径”应用。因此,您的包含路径包括正在编译的当前源文件的文件夹,以及您使用项目设置配置的其他文件夹。所以它会在每一个的父文件夹中寻找一个 test.h。
  • 可能我没说清楚。 C++标准保证..是指父目录吗?
  • @MrLister 我的评论关注的是,二进制文件的父目录应该包含 test.h 文件..
  • @EdHeal:为什么“尝试”它会告诉 OP 它是否是合法的 C++?

标签: c++ include include-path


【解决方案1】:

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

标头名称预处理标记应仅出现在 #include 中 预处理指令 (16.2)。两种形式的序列 header-names 以 实现定义的方式映射到 headers 或 16.2 中指定的外部源文件名

所以你有它:它都是实现定义的。 §16.2 然后说,除其他一些与您的问题没有直接关系的事情:

表单的预处理指令

#include"q-char-sequence"换行

导致该指令被整个内容替换 由"之间的指定序列标识的源文件 分隔符。 在指定的源文件中搜索 实现定义的方式。

这很有意义。为什么不能为不使用“..”约定的文件系统创建 C++ 编译器?

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

更有趣的问题是 C++ 实现的文档对此有何评论。但即便如此,您可能会得到关于该主题的相当笼统的解释。例如,MSVC 2015 documentation for #include 表示:

path-spec 是一个文件名,可以选择在前面加上一个 目录规范。文件名必须命名现有文件。这 path-spec 取决于操作系统 程序已编译。

【讨论】:

  • 鉴于这样做是合法的,我很好奇这样做是否是一种好习惯。除了看起来“丑”之外,我没有反对意见,但更有经验的 C++ 程序员可能有更好的洞察力。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多