2016-01-09 9 views
2

есть. Как говорится в названии.

Использование #include"test.h" является законным.
Использование #include"test/test.h" также является законным.
Но можно ли использовать #include"../test.h"?
C++ Является ли законным использовать .. (dot dot) в директиве #include?

Например, #pragma once является законным почти для всех компиляторов.
Но это не стандартно в C++.

Я не могу найти документы, которые говорят ... «Гарантия» означает значение родительского каталога.
Может ли кто-нибудь мне помочь?

+0

Да, его юридический, но убедитесь, что всякий раз, когда вы создаете двоичный, а затем родительский каталог вашего двоичного каталога, это файл test.h. – Nishant

+0

Относительные пути, такие как «../test.h», являются совершенно законными. Путь будет применяться относительно вашего «Включить путь». Таким образом, ваш путь include включает в себя папку с исходным исходным файлом, а также другие папки, которые вы настраиваете с настройками вашего проекта. Поэтому он будет искать test.h в родительской папке каждого из них. –

+0

Возможно, я не сказал ясно. Является ли стандартная гарантия на C++ .. означает родительский каталог? – Caesar

ответ

3

стандарт C++ говорит в §2.8/1:

Заголовок имя предобработки маркеры должны появляться только в пределах предварительной обработки директивы #include (16.2). Последовательности в обеих формах заголовков сопоставляются с вариантами реализации с заголовками или с внешними именами исходных файлов, как указано в 16.2.

Итак, у вас есть это: все это определено реализацией. §16.2 то говорит, среди других вещей, непосредственно не связанные с вашим вопросом:

предварительной обработки директивы формы

#include"д-символ последовательности"новая линия

вызывает замену этой директивы всем содержимым исходного файла , идентифицированного указанной последовательностью между " разделителей. Именованный исходный файл выполняется в образом реализации.

И это имеет большой смысл. Почему бы вам не создать компилятор C++ для файловых систем, которые не используют соглашение «..»?

Таким образом, чтобы ответить на ваш вопрос: Да, это законно в соответствии со стандартом C++, но это не удивительно, потому что почти все технически законно для директивы #include.

Более интересный вопрос заключается в том, что об этом может сообщить документация вашей реализации на C++. Но даже тогда вам может быть предоставлено довольно общее объяснение по этой теме. Например, MSVC 2015 documentation for #include говорит:

путь спекуляция это имя файла, который необязательно может предшествовать спецификации в каталога. Имя файла должно содержать имя существующего файла.Синтаксис спецификации пути зависит от операционной системы, на которой скомпилирована программа .

 Смежные вопросы

  • Нет связанных вопросов^_^