MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.08.23 19:08
Оценка: 1 (1) :)
MS в документации брешет, что макрос __FILE__ раскрывается в полный путь только при указании ключа /FC. На деле же все компиляторы от 15.00 до 19.29 (совсем последних у меня нет) при отсутствии /FC кладут без путей только имена файлов .c/.cpp. Если __FILE__ встречается в заголовке, то для файлов, включенных #include "file.h", всегда кладутся полные пути, а для включенных #include <file.h> — относительные.

По логике, если уж класть полный путь, невзирая на отсутствие /FC, то надо бы наоборот — только для "внешних" файлов, включаемых #include <>. Для "собственных", включаемых #include "", следовало бы класть только имя (или то, что указано в кавычках).

Такое поведение тянет на баг, или ему есть более разумное объяснение?
Re: MS VC++: путь в __FILE__
От: vdimas Россия  
Дата: 14.08.23 04:02
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Такое поведение тянет на баг, или ему есть более разумное объяснение?


Выглядит разумно
Re[2]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.08.23 07:15
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Выглядит разумно


А разумное объяснение сделать сможете?
Re[3]: MS VC++: путь в __FILE__
От: vdimas Россия  
Дата: 14.08.23 07:44
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

V>>Выглядит разумно

ЕМ>А разумное объяснение сделать сможете?

Попытаюсь:
— файлы c/cpp включаются в проект явно;
— файлы h/hpp могут залететь в проект "откуда угодно" из доступного + доп.указанного пути.

Соотв., полный путь заголовочных файлов помогает отладке сборочной конфигурации.
Re[4]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.08.23 08:01
Оценка:
Здравствуйте, vdimas, Вы писали:

V>- файлы c/cpp включаются в проект явно;

V>- файлы h/hpp могут залететь в проект "откуда угодно" из доступного + доп.указанного пути.

Еще раз, по буквам:

— Для .h-файлов, включенных директивами #include "xxx.h" (так традиционно включаются "свои", локальные файлы), в объектный файл всегда кладется полный путь.

— Для .h-файлов, включенных директивами #include <xxx.h> (так традиционно включаются "чужие", библиотечные файлы), в объектный файл всегда кладется путь относительно его каталога, указанного в /I.

Если второе еще можно считать логичным, то где логика в первом?
Re[5]: MS VC++: путь в __FILE__
От: vdimas Россия  
Дата: 14.08.23 08:12
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Еще раз, по буквам:

ЕМ>- Для .h-файлов, включенных директивами #include "xxx.h" (так традиционно включаются "свои", локальные файлы), в объектный файл всегда кладется полный путь.

Но подхватиться может "не свой" файл.


ЕМ>- Для .h-файлов, включенных директивами #include <xxx.h> (так традиционно включаются "чужие", библиотечные файлы), в объектный файл всегда кладется путь относительно его каталога, указанного в /I.


Чужие файлы тоже могут конфликтовать по именам, поэтому выглядит логично.
Чужие файлы обычно идут из репозитория какого-нить пакетного менеджера, где корень один, который не интересен.

Хотя, на мой вкус (это лично наша специфика), могут быть одновременно установлены чужие либы разных версий, поэтому тут порой тоже охота полный путь. ))


ЕМ>Если второе еще можно считать логичным, то где логика в первом?


В первом вообще ноль вопросов.
Отредактировано 14.08.2023 8:13 vdimas . Предыдущая версия .
Re[6]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.08.23 13:22
Оценка:
Здравствуйте, vdimas, Вы писали:

ЕМ>>- Для .h-файлов, включенных директивами #include "xxx.h" (так традиционно включаются "свои", локальные файлы), в объектный файл всегда кладется полный путь.


V>Но подхватиться может "не свой" файл.


Как он может подхватиться иначе, как по ошибке? Кто в здравом уме использует форму с кавычками для включения файлов, находящихся неизвестно где?

ЕМ>>Если второе еще можно считать логичным, то где логика в первом?


V>В первом вообще ноль вопросов.


В чем именно Вы видите логику писать в бинарник полный путь к заведомо локальному файлу?
Re[7]: MS VC++: путь в __FILE__
От: rg45 СССР  
Дата: 14.08.23 13:53
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В чем именно Вы видите логику писать в бинарник полный путь к заведомо локальному файлу?


Вот прям заведомо-заведомо? А может, RTFM, все-таки?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 14.08.2023 13:54 rg45 . Предыдущая версия .
Re: MS VC++: путь в __FILE__
От: Teolog  
Дата: 14.08.23 13:58
Оценка:
ЕМ>Такое поведение тянет на баг, или ему есть более разумное объяснение?
Отсутсвие жесткой записи абсолютных путей достигаеться сломанной компиляцией нескольких файлов с одинаковыми именами в разных папках.
Ломать еще и заголовки по всем библиотекам — до такого даже майкрософт не дойдет, отловят топов и говядиной насильно накормят.
Re[8]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.08.23 13:59
Оценка:
Здравствуйте, rg45, Вы писали:

R>Вот прям заведомо-заведомо?


Я ж не зря подчеркнул:

Как он может подхватиться иначе, как по ошибке? Кто в здравом уме использует форму с кавычками для включения файлов, находящихся неизвестно где?

Re[5]: MS VC++: путь в __FILE__
От: пффф  
Дата: 14.08.23 14:04
Оценка: +2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Еще раз, по буквам:


Или, логика другая


ЕМ>- Для .h-файлов, включенных директивами #include "xxx.h" (так традиционно включаются "свои", локальные файлы), в объектный файл всегда кладется полный путь.


Так включаются все файлы, которые не являются файлами стандартной библиотеки языка, и ищутся в путях /I. Куда они указывают — хз, поэтому кладём полный путь


ЕМ>- Для .h-файлов, включенных директивами #include <xxx.h> (так традиционно включаются "чужие", библиотечные файлы), в объектный файл всегда кладется путь относительно его каталога, указанного в /I.


Так включаются только стандартные хидеры, соответственно, путь к ним фиксированный (лежат где-то рядом с компилятором)


ЕМ>Если второе еще можно считать логичным, то где логика в первом?


Вообще говоря, подключение инклюдов по <> компилятором может делаться как угодно, этих файлов вполне может не быть физически на диске. Это по стандарту так. Поэтому логика у компилятора по части пути в __FILE__ относительно стандарта вполне логичная.
Re[9]: MS VC++: путь в __FILE__
От: rg45 СССР  
Дата: 14.08.23 14:04
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>

ЕМ>Как он может подхватиться иначе, как по ошибке? Кто в здравом уме использует форму с кавычками для включения файлов, находящихся неизвестно где?


Ну и ожидаемо, снова поперла фонвизинщина. Я уж боюсь и спрашивать про здравие ума того, кто наделил эти директивы именно такими свойствами.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 14.08.2023 14:05 rg45 . Предыдущая версия . Еще …
Отредактировано 14.08.2023 14:05 rg45 . Предыдущая версия .
Re[7]: MS VC++: путь в __FILE__
От: vdimas Россия  
Дата: 14.08.23 14:36
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Кто в здравом уме использует форму с кавычками для включения файлов, находящихся неизвестно где?


В здравом уме можно описаться в имени включаемого файла и попасть на "неизвестно где".


ЕМ>>>Если второе еще можно считать логичным, то где логика в первом?

V>>В первом вообще ноль вопросов.
ЕМ>В чем именно Вы видите логику писать в бинарник полный путь к заведомо локальному файлу?

Используй FILE из c/cpp — это ж обычно отладочные вещи какие-нить для целевого кода.

А в h-файлы оно может быть вставленно преднамеренно для отладки чуть другого — конфигурации билда.
Re[2]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.08.23 17:23
Оценка:
Здравствуйте, Teolog, Вы писали:

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


Я не понял, где тут причина, а где следствие. Но, чтоб не ломалось, неплохо бы иметь возможность адекватно управлять формированием этих путей. А то оно вроде как управляется, а на деле все равно ведет себя, как ему вздумается.
Re[8]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.08.23 17:28
Оценка:
Здравствуйте, vdimas, Вы писали:

V>можно описаться в имени включаемого файла и попасть на "неизвестно где".


И при этом все продолжит успешно компилироваться и хотя бы более-менее работать? Сможете найти реальный пример, в котором такое может получиться случайно?

V>Используй FILE из c/cpp


И куда мне его засунуть?

V>это ж обычно отладочные вещи какие-нить для целевого кода.


Ну да, я хочу, чтоб в бинарник складывались имена исходных файлов с номерами строк, в которых происходят различные операции, чтобы это можно было записывать в логи, но чтоб не демонстрировать миру структуру каталогов в моей рабочей системе.
Re: MS VC++: путь в __FILE__
От: B0FEE664  
Дата: 15.08.23 00:22
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>MS в документации брешет, что макрос __FILE__ раскрывается в полный путь только при указании ключа /FC.

По ссылке не так написано. /FC — полный путь, отсутствие /FC — нет гарантий полного пути.

ЕМ>На деле же все компиляторы от 15.00 до 19.29 (совсем последних у меня нет) при отсутствии /FC кладут без путей только имена файлов .c/.cpp. Если __FILE__ встречается в заголовке, то для файлов, включенных #include "file.h", всегда кладутся полные пути, а для включенных #include <file.h> — относительные.

Вы проверяли это в системе с одним логическим диском?

ЕМ>По логике, если уж класть полный путь, невзирая на отсутствие /FC, то надо бы наоборот — только для "внешних" файлов, включаемых #include <>. Для "собственных", включаемых #include "", следовало бы класть только имя (или то, что указано в кавычках).

По логике компилятор не должен преобразовывать одни пути в другие, если его об этом не просят, а то будет как с gcc под виндой
Автор: B0FEE664
Дата: 08.09.21
.

ЕМ>Такое поведение тянет на баг, или ему есть более разумное объяснение?

Я бы сказал, что пути могут строится относительно того каталога, который является текущим для компилятора в момент запуска, а как там оно на самом деле —
И каждый день — без права на ошибку...
Re[9]: MS VC++: путь в __FILE__
От: пффф  
Дата: 15.08.23 00:26
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Ну да, я хочу, чтоб в бинарник складывались имена исходных файлов с номерами строк, в которых происходят различные операции, чтобы это можно было записывать в логи, но чтоб не демонстрировать миру структуру каталогов в моей рабочей системе.



В чем проблема при выводе в лог обрезать имена сорцов как тебе нравится?
Re[10]: MS VC++: путь в __FILE__
От: CreatorCray  
Дата: 15.08.23 05:55
Оценка: +1 :))
Здравствуйте, пффф, Вы писали:

П>В чем проблема при выводе в лог обрезать имена сорцов как тебе нравится?

Он хочет не светить свои C:\Users\Пупсик\Сырки\Этот_козёл_постоянно_задерживает_оплату\MySampleProject\SpisokMudakoff.h в бинаре
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[3]: MS VC++: путь в __FILE__
От: Teolog  
Дата: 15.08.23 08:50
Оценка:
ЕМ>Я не понял, где тут причина, а где следствие. Но, чтоб не ломалось, неплохо бы иметь возможность адекватно управлять формированием этих путей. А то оно вроде как управляется, а на деле все равно ведет себя, как ему вздумается.
Должны писаться абсолютные иначе неоднозначность, и нужен доступ к логике поиска файлов по относительным путям, но кто-то вбил костыль вокруг которого начались танцы.
Логику в отношении C++ компиляторов применять не следует, работает и слава Ктулху. Не надо ничего менять и перенастраивать — оно и так с трудом ворочается.
Язык старый и состоит из костылей и частных случаев, а какие там пути пишутся- это исключительно отладчика проблема, и пусть они с компилятором сами разгребаются.
Re[4]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.08.23 09:25
Оценка:
Здравствуйте, Teolog, Вы писали:

T>Должны писаться абсолютные


По-хорошему, это должно адекватно управляться.

T>какие там пути пишутся- это исключительно отладчика проблема


К отладчику это не имеет ни малейшего отношения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.