Re[5]: Для чего нужно "./" в #include?
От: Юрий Жмеренецкий ICQ 380412032
Дата: 19.08.09 21:56
Оценка: 5 (3)
Здравствуйте, igna, Вы писали:

I>Вот. То есть #include "./path/to/header.h" в той же мере "глупая конструкция" что и #include <./Dir/Header.h>. А то почитав твой первый ответ можно было подумать, будто в зависимости от использованных ограничителей точка с косой чертой в начале пути может иметь смысл или не иметь его. На самом деле они никогда не имеют смысла.


В специфических контекстах — могут иметь смысл: include_alias в MSVC:
#pragma include_alias("file.h", "path/file.h")
#include "file.h"     // фактически - "path/file.h"
#include "./file.h"   // фактически - "file.h", требуется полное соответствие
Re: Для чего нужно "./" в #include?
От: byleas  
Дата: 17.08.09 18:00
Оценка: 1 (1)
Здравствуйте, ChainEG, Вы писали:

CEG>
CEG>#include <./Dir/Header.h>
CEG>

Имхо, глупая конструкция. В угловых скобках указываются файлы, которые компилятор ищет в "системных" каталогах (заданных через -I), а здесь путь относительный

CEG>Посему вопрос: нужен ли и для чего этот "./" в именах заголовочных файлов?

Относительные пути иногда бывают нужны для разрешения неоднозначности (в случае коллизии имён файлов или путей), но они указываются через кавычки (#include "./path/to/header.h")

В общем, пишут либо #include <Dir/Header.h> (путь относительно одного из каталогов, заданных через -I) либо #include "Dir/Header.h" (зависит от контекста, обычно это путь относительно текущего каталога).
Re[4]: Для чего нужно "./" в #include?
От: igna Россия  
Дата: 18.08.09 09:18
Оценка: 1 (1)
Здравствуйте, byleas, Вы писали:

B>Ничем. Я имел ввиду относительные вообще (ведь есть и "../").


Вот. То есть #include "./path/to/header.h" в той же мере "глупая конструкция" что и #include <./Dir/Header.h>. А то почитав твой первый ответ можно было подумать, будто в зависимости от использованных ограничителей точка с косой чертой в начале пути может иметь смысл или не иметь его. На самом деле они никогда не имеют смысла.
Для чего нужно "./" в #include?
От: ChainEG  
Дата: 17.08.09 14:47
Оценка:
#include <./Dir/Header.h>


Столкнулся с тем, что среда MSVC 2008 не хочет открыть файл Header.h через контекстное меню Open Document <./Dir/Header.h>.
Пути к директориям, где лежат header-ы, прописаны, указанный файл там есть, программа успешно компилится.
А при попытке открыть этот файл, говорит, что не может найти его. Лечится это удалением префикса "./". Но как-то не хочется менять исходный код ради прихотей среды разработки.

Посему вопрос: нужен ли и для чего этот "./" в именах заголовочных файлов?
Re: Для чего нужно "./" в #include?
От: посетитель rsdn.life  
Дата: 17.08.09 14:56
Оценка:
Здравствуйте, ChainEG, Вы писали:

CEG>
CEG>#include <./Dir/Header.h>
CEG>


CEG>Посему вопрос: нужен ли и для чего этот "./" в именах заголовочных файлов?


По-моему оно ни на что не влияет.
Re: Для чего нужно "./" в #include?
От: Аноним  
Дата: 17.08.09 15:49
Оценка:
CEG>Посему вопрос: нужен ли и для чего этот "./" в именах заголовочных файлов?
Для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах.
В винде скорее всего пофиг.
Re[2]: Для чего нужно "./" в #include?
От: igna Россия  
Дата: 17.08.09 16:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах.


А что, #include <Dir/Header.h> "на юниксах" означает то же, что #include </Dir/Header.h>
Re: Для чего нужно "./" в #include?
От: Vain Россия google.ru
Дата: 17.08.09 20:52
Оценка:
Здравствуйте, ChainEG, Вы писали:

CEG>Посему вопрос: нужен ли и для чего этот "./" в именах заголовочных файлов?

Здесь
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Для чего нужно "./" в #include?
От: Аноним  
Дата: 17.08.09 22:54
Оценка:
А>>Для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах.
I>А что, #include <Dir/Header.h> "на юниксах" означает то же, что #include </Dir/Header.h>
хз, что сделает #include <Dir/Header.h>, но команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .
Re[2]: Для чего нужно "./" в #include?
От: Аноним  
Дата: 17.08.09 23:00
Оценка:
CEG>>Посему вопрос: нужен ли и для чего этот "./" в именах заголовочных файлов?
V>Здесь
Вопрос был не о кавычках/уголках, а о точке
Re[4]: Для чего нужно "./" в #include?
От: igna Россия  
Дата: 18.08.09 04:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>хз, что сделает #include <Dir/Header.h>, но команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .


Верно, он будет искать только файлы, путь к которым указан в переменной PATH. В некотором смысле аналогом двум возможностям задавать имя команды, с "./" в начале и без, является угловые скобки и кавычки в #include. А "./" в начале пути #include избыточен независимо от того, какие ограничители используются.
Re[3]: Для чего нужно "./" в #include?
От: Аноним  
Дата: 18.08.09 06:59
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Аноним, Вы писали:


А>>Для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах.


I>А что, #include <Dir/Header.h> "на юниксах" означает то же, что #include </Dir/Header.h>


Нет.
Первое пляшет от текущего каталога, второе от корня ФС == "/".
А #include, в линунксе, пляшет от /usr/include. Например вот равноценные записи:

#include <wx/wx.h>
#include <./wx/wx.h>
#include </usr/include/wx/wx.h>

Ну и как ниже в треде не по теме: <> and "".
Re[4]: Для чего нужно "./" в #include?
От: igna Россия  
Дата: 18.08.09 08:37
Оценка:
А "./" нужен "для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах"?
Re[2]: Для чего нужно "./" в #include?
От: igna Россия  
Дата: 18.08.09 08:41
Оценка:
Здравствуйте, byleas, Вы писали:

B>Относительные пути иногда бывают нужны для разрешения неоднозначности (в случае коллизии имён файлов или путей), но они указываются через кавычки (#include "./path/to/header.h")


Да? А чем #include "./path/to/header.h" отличается от #include "path/to/header.h"?
Re[3]: Для чего нужно "./" в #include?
От: byleas  
Дата: 18.08.09 09:05
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, byleas, Вы писали:


B>>Относительные пути иногда бывают нужны для разрешения неоднозначности (в случае коллизии имён файлов или путей), но они указываются через кавычки (#include "./path/to/header.h")

I>Да? А чем #include "./path/to/header.h" отличается от #include "path/to/header.h"?
Ничем. Я имел ввиду относительные вообще (ведь есть и "../"). А вообще, это implementation-defined.
Re: Для чего нужно "./" в #include?
От: Шебеко Евгений  
Дата: 18.08.09 09:29
Оценка:
CEG>
CEG>#include <./Dir/Header.h>
CEG>

Человек, который писал, не знал что существует

#include "Dir/Header.h"


А его конструкция вообще работать не обязана.
Т.к. он открывает файл относительно текущего каталога, а что им в этот момент
будет для процесса-компилятора вообще непонятно.
Re[4]: Для чего нужно "./" в #include?
От: rising_edge  
Дата: 18.08.09 11:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А> команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .

Не болтайте ерундой.
Re[5]: Для чего нужно "./" в #include?
От: Аноним  
Дата: 18.08.09 11:58
Оценка:
А>> команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .
_>Не болтайте ерундой.
а вы попробуйте
Re[6]: Для чего нужно "./" в #include?
От: rising_edge  
Дата: 18.08.09 12:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>> команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .

_>>Не болтайте ерундой.
А>а вы попробуйте
Я каженный божий день пробую по несколько раз. ЧЯДНТ?
Re[7]: Для чего нужно "./" в #include?
От: Аноним  
Дата: 18.08.09 13:00
Оценка:
А>>>> команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .
_>>>Не болтайте ерундой.
А>>а вы попробуйте
_>Я каженный божий день пробую по несколько раз. ЧЯДНТ?
и файлы/скрипты которые вы исполняете не прописаны в PATH?
если команда начинается не на ./ то файл ищется по PATH
если на / — то ето рут
если на ./ — файл ищется в текущем каталоге
Re[5]: Для чего нужно "./" в #include?
От: Death_Mokar Украина  
Дата: 18.08.09 13:50
Оценка:
Здравствуйте, igna, Вы писали:

I>А "./" нужен "для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах"?


Да. В явном виде. И это не фишка линукса. Так уж издревле пошло: "." — текущий каталог, ".." — родительский каталог...
улыбок тебе дед мокар
Re[5]: Для чего нужно "./" в #include?
От: byleas  
Дата: 18.08.09 13:55
Оценка:
Здравствуйте, igna, Вы писали:

I>Вот. То есть #include "./path/to/header.h" в той же мере "глупая конструкция" что и #include <./Dir/Header.h>.

Ну, я бы не сказал. В первом случае явное указание, новичкам поможет, а вреда не будет. Во втором я даже не знаю, что будет
Re[6]: Для чего нужно "./" в #include?
От: igna Россия  
Дата: 18.08.09 14:36
Оценка:
Здравствуйте, Death_Mokar, Вы писали:

I>>А "./" нужен "для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах"?


D_M>Да. В явном виде.


Неверно. Нужным в данном случае (напомню, что речь об инклюде) "./" не назовешь, он что есть, что его нет.

D_M>И это не фишка линукса. Так уж издревле пошло: "." — текущий каталог, ".." — родительский каталог...


Это фишка юникса. Не знаю уж, можно ли сказать, что это издревле.
Re[7]: Для чего нужно "./" в #include?
От: Death_Mokar Украина  
Дата: 18.08.09 14:56
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Death_Mokar, Вы писали:


I>>>А "./" нужен "для того чтобы указывать что путь начинается от текущей директории, а не от корня FS на юниксах"?


D_M>>Да. В явном виде.


I>Неверно. Нужным в данном случае (напомню, что речь об инклюде) "./" не назовешь, он что есть, что его нет.


"нужен" <> "необходим", т.е. в данном контексте "нужен" == "используется для"

D_M>>И это не фишка линукса. Так уж издревле пошло: "." — текущий каталог, ".." — родительский каталог...


I>Это фишка юникса. Не знаю уж, можно ли сказать, что это издревле.


...ну, когда-то работая учителем информатики в школе, я учил детей этому под ДОС, уж не знаю считать ли это "издревлем"
улыбок тебе дед мокар
Re[8]: Для чего нужно "./" в #include?
От: rising_edge  
Дата: 18.08.09 17:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>>> команд-лайн шелл не исполняет файл который находится в подкаталоге относительно текущего если в начале не указать .

_>>>>Не болтайте ерундой.
А>>>а вы попробуйте
_>>Я каженный божий день пробую по несколько раз. ЧЯДНТ?
А>и файлы/скрипты которые вы исполняете не прописаны в PATH?

Не все.

А>если команда начинается не на ./ то файл ищется по PATH


Это не совсем так.

А>если на / — то ето рут


Не понял фразу. Вы можете выражаться яснее?
Если путь начинается с /, то это абсолютный путь, и искать ничего не надо.

А>если на ./ — файл ищется в текущем каталоге


Да. . -- это текущий каталог.
Re: Подведем итоги
От: ChainEG  
Дата: 19.08.09 07:18
Оценка:
Спасибо всем ответившим.

Делаем вывод, что префикс "./" не нужен ни в #include<>, ни в #include"".
Re[2]: Подведем итоги
От: Аноним  
Дата: 20.08.09 11:47
Оценка:
Здравствуйте, ChainEG, Вы писали:

CEG>Делаем вывод, что префикс "./" не нужен ни в #include<>, ни в #include"".


таки да, префикс ./ роли не играет, но кавычки и скобки играют

Тесты проводились в MS VS 2008 SP1
Solution
  test1
    Dir1
      Header1.h:  std::wstring get_str() { return std::wstring(L"string 1"); }
    test1.cpp:    #include "./Dir1/Header1.h"  std::wcout << get_str();
  test2
    Dir1
      Header1.h:  std::wstring get_str() { return std::wstring(L"string 2"); }
    test1.cpp:    #include <./Dir1/Header1.h>  std::wcout << get_str();
  test3
    Dir1
      Header1.h:  std::wstring get_str() { return std::wstring(L"string 3"); }
    test3.cpp:    #include "Dir1/Header1.h"  std::wcout << get_str();
  test4
    Dir1
      Header1.h:  std::wstring get_str() { return std::wstring(L"string 4"); }
    test4.cpp:    #include <Dir1/Header1.h>  std::wcout << get_str();

Program Files
  Microsoft Visual Studio 9.0
    VC
      include
        Dir1
          Header1.h:  std::wstring get_str() { return std::wstring(L"string 5"); }


Результаты:
test1:  string 1
test2:  string 5
test3:  string 1
test4:  string 5
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.