Переменная среды в макро-пути - PullRequest
3 голосов
/ 17 апреля 2011

Мне нужно определить путь к файлам с макросами.Как я могу использовать переменную окружения $ HOME?Я не могу найти его в руководстве по GNU, и это не работает:

#define LOGMMBOXMAN    "$HOME/mmbox/LOGmmboxman"

Ответы [ 3 ]

5 голосов
/ 17 апреля 2011

Нет, не должно, и вам, вероятно, не нужны постоянные настройки, подобные этим, в любом случае.Если вы сделали это, и это сработало так, как вы намеревались его использовать, ваш домашний каталог будет встроен так, как если бы $HOME был для того, кто строит.Исполняемый файл зависит от того, какой конкретный домашний каталог существует.Если все в порядке, просто #define свой дом.Я подозреваю, что это не так, поэтому вам нужно вывести его во время выполнения.

Для вывода во время выполнения, что вы хотите, это это , например:

const char* home_dir = getenv("HOME");

Если не определено $HOME, возвращается NULL, поэтому обязательно проверьте это.

Затем вы можете построить свою строку на основе этого.Вам понадобится #include <stdlib.h>.

2 голосов
/ 17 апреля 2011

Звучит так, будто вы действительно спрашиваете "как я могу установить какой-нибудь макрос cpp из моей среды?"

Если sothen, вы можете просто добавить его в CPPFLAGS .

export CPPFLAGS="$CPPFLAGS -D LOGMMBOXMAN=$HOME/mmbox/LOGmmboxman"

Тогда в вашем коде

#ifndef LOGBOXMAN
#error LOGBOXMAN not defined
#endif

Затем убедитесь, что ваш источник собран с использованием CPPFLAGS в командной строке для gcc:

$ gcc -c file.c $CPPFLAGS
1 голос
/ 17 апреля 2011

Вы не можете.Вы должны использовать свою систему сборки для определения макроса со значением $HOME (или эквивалентом в не-unix системе), то есть что-то вроде этого:

gcc -DHOME="/home/username" file.c

или "/Users/username" для Mac OS Xили "C:\Users\username" (или что-то) для Windows.По сути, GCC предоставляет флаг -D для определения макроса в командной строке.Вы можете настроить скрипт (или свою систему сборки), чтобы позаботиться об этом макроопределении, или, возможно, создать системно-зависимый включающий файл для правильного определения макроса HOME.

Затем в вашемЗаголовок C вы можете сделать:

#define LOGMMBOXMAN HOME "/mmbox/LOGmmboxman"

Обратите внимание, что в C последовательные строковые литералы объединяются.Таким образом, этот макрос расширяется до:

"/home/username" "/mmbox/LOGmmboxman"

Который C интерпретирует как

"/home/username/mmbox/LOGmmboxman"

РЕДАКТИРОВАТЬ: Все это мышление, а я не думал!Ох!

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...