2015-03-18 5 views
1

Я получил тысячи файлов, которые включают в себя, что файлы с форвардом SlashesПочему Путь в VS C++ содержит прямую косую черту, а не обратную косую черту?

#include <this/thread.hpp> 

Почему? Изначально программа была написана в VS 2008.

Это приводит к фатальной ошибке C1083

Если изменить путь к #include "..\this\thread.hpp" он находит файл

+0

передняя косая черта должна использоваться для переносимости http://stackoverflow.com/questions/24186647/c1083-cannot-open-include-file-math-h-no-such-file-or-directory http: // stackoverflow .com/questions/13367999/visual-studio-2010-include-directory-paths –

+1

Существуют три различия между #include и #include ".. \ this \ thread.hpp". Только один из них - это вид косой черты. – sigy

ответ

2

Windows, принимает как Форвард и обратный слэш в качестве разделителя. По крайней мере, с Windows XP.

Я не могу читать мысли, но я мог догадаться, что косая черта использовалась во имя (потенциальной) переносимости и/или соответствия стандартам, потому что обратная косая черта в директиве include имеет неопределенное поведение в C++ 03.

C++ 03 §2.8/2:

Если какой-либо из символов "или \, или любой из последовательностей символов/* // или появляется в д-полукокса последовательности или ч -char-последовательность, или символ "появляется в час-полукокса-последовательности, поведение не определено.

формулировка была изменена в C++ 11 в соответствии с проектом. поведение больше не определено, но все еще определенная реализация.

C++ 11 draft §2.9/2

Появление любого из символов 'или \ или какого-либо из последовательностей символов/* // или в д-полукокса последовательности или ч-полукокса-последовательности условно поддерживается от реализации семантика, так как - это появление символа «в h-char-последовательности».

Об ошибке:

Если изменить путь к #include ".. \ это \ thread.hpp" он находит файл

Обратите пристальное внимание на ваши два разные включают директивы. Там больше различий, чем разделитель путей. Во-первых, версия прямого косой черты не относится к родительскому пути (../), во-вторых, путь заключен в < >, что является неправильным в этом случае, поскольку кажется, что путь предназначен для текущего файла. См. https://stackoverflow.com/a/21594/2079303 для более подробной информации.

+0

Если это совместимо, почему «/» вызывает проблемы в Windows 7? – jean

+2

Если вы включили работу с \ только, то это похоже на ошибку. Если у вас есть воспроизводимый случай, я предлагаю вам сообщить об ошибке для Microsoft. – user2079303

+0

@jean Я обновил свой ответ, относящийся к вашей ошибке. – user2079303

0

Ошибка C1083 «не может открыть файл include», что обычно означает, что компилятор не смог найти файл.

#include <this/thread.hpp> 

Есть каталог под названием «это» где-нибудь в вашем пути включают в себя каталог? Это гораздо более вероятно, чем проблема с косой чертой.

+0

Папка «это» существует. – jean

+0

Но есть ли он в любом из включенных путей? (Например, с учетом вашего обновления, есть «..» в вашем наборе включенных путей?) – arayq2

0

Пока не C++ -специфических, то где использование \ является маскирующим, по крайней мере, когда он находится в пределах <...> тегов, так что если вы действительно хотите, чтобы указать его в качестве разделителя пути, вам нужно будет ввести \\ ,Чтобы избежать двойных обратных косых черт каждый раз, когда вы хотите иметь только один тип обратного слэша, а также потому, что он действует одинаково, вы можете применить ту же самую способность указывать разделение путей между папками, если просто используете /. Эта простота сводит на нет путаницу к кому-то, кто не понимает, что он ускользает, так что они не берут ускоренный путь буквально и помещают его в адресную строку проводника и путают, когда он не доставляет их в нужное место.

Обратите внимание, что если для этого требуются теги <...>, вы указываете системный файл, а оператор "..." должен включать локально сгенерированный. Эти синтаксисы отличаются по своим требованиям к экранированию.

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