Макрос C++ __FILE__ с абсолютным путем

Я пытаюсь получить абсолютный путь к скомпилированному файлу во время компиляции в C++. Мне известен макрос __FILE__, однако макрос может быть вычислен как по абсолютному, так и по относительному пути, в зависимости от аргументов препроцессора.

Я хотел бы убедиться, что мой __FILE__ (или любой другой макрос) оценивает полный, абсолютный путь к файлу. Есть ли способ надежно сделать это кроссплатформенным? (Я компилирую для VS2013, VS2015, GCC на ubuntu, GCC на MinGW)

передать абсолютный путь при компиляции файла, по крайней мере, когда вы управляете сборкой, как в make-файле

Jean-François Fabre 01.05.2018 23:51

Чего вы пытаетесь достичь? Может, подходящим решением будет пройти что-то вроде -DDIR=$PWD?

Eugene Sh. 01.05.2018 23:56

@ Jean-FrançoisFabre Спасибо! Это работает в GCC - я настроил свои make-файлы для работы таким образом. Однако в Visual Studio VS контролирует пути. В настоящее время я использую это решение для получения каталога проекта в Visual Studio: stackoverflow.com/a/38203437/2946480. Затем в своем коде я добавляю несколько #ifdefs, чтобы таким образом получить абсолютный путь. Однако было бы здорово иметь универсальное решение.

Michał 02.05.2018 00:01

@EugeneSh. Я пытаюсь получить абсолютный путь для ведения журнала. Я сравниваю путь к корню репозитория GitHub, чтобы получить путь к файлу относительно корня репозитория. Не могли бы вы подробнее рассказать о флаге -DDIR=$PWD? Я не мог найти никакой информации по этому поводу.

Michał 02.05.2018 00:05

Я предполагаю, что трюк с $PWD таков: $PWD - это переменная оболочки (вероятно, из make), которая имеет текущий каталог. Я считаю, что вам нужно добавить двойные кавычки (например, -DDIR=\"$PWD/\"), а затем, когда вы используете __FILE__, вы можете использовать DIR __FILE__. Это две строки наподобие: "/foo/" и "bar.c", а компилятор [всегда] объединяет две примыкающие друг к другу строки (т.е. результат - "/foo/bar.c"). DIR не обязательно должен быть PWD, но может [может быть, лучше быть] директорией проекта, как вы описали

Craig Estey 02.05.2018 01:20

@CraigEstey Спасибо! Теперь это имеет гораздо больше смысла. Я думал, что -DDIR был предопределенным флагом. Вместо этого -D - это флаг, и в этом контексте он означает: define DIR as $PWD, правильно?

Michał 02.05.2018 01:24

Да, вместо DIR вы можете назвать его MY_SUPER_DUPER_PROJECT_DIRECTORY_TOP [если хотите :-)]. Не забудьте использовать двойные кавычки с обратной косой чертой, поскольку DIR должен преобразовать нить в эквивалент: #define DIR "/foo/". Когда я делаю такие вещи, я использую PRJDIR или PRJSRC.

Craig Estey 02.05.2018 01:28

Отвечает ли это на ваш вопрос? Макрос __FILE__ показывает полный путь

phuclv 30.03.2020 13:47

@phuclv Я думаю, это решает противоположный вопрос. Я ищу абсолютный, а не относительный путь.

Michał 31.03.2020 22:59

на этот вопрос уже есть ответ: В VC при использовании / FC __FILE__ расширяется до полного пути. Как принудительно указать абсолютные пути для вывода ошибок сборки в Visual Studio

phuclv 01.04.2020 04:24

Этот вопрос касается только Visual Studio. Я спрашивал здесь о различных платформах, надеясь на санкционированный язык способ сделать это, или, по крайней мере, на то, что работает с gcc и vc.

Michał 03.04.2020 20:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
11
1 212
0

Другие вопросы по теме