Как я использую препроцессор C для создания замены с переменной среды

В коде ниже, я хотел бы значение THE_VERSION_STRING быть взятым от значения переменной среды MY_VERSION во время компиляции

namespace myPluginStrings {
const  char* pluginVendor = "me";
const  char* pluginRequires =  THE_VERSION_STRING;
};

Так, чтобы, если я ввожу:

export MY_VERSION="2010.4"

pluginRequires будет установлен в "2 010,4", даже если MY_VERSION установлен на что-то еще во время выполнения.

ОБНОВЛЕНИЕ: (21 февраля) спасибо за Вашу справку все.Работает. Поскольку я использую Грабли в качестве системы сборки, каждый из моих CFLAGS является рубиновой переменной. Также значения должны закончиться в кавычках. Поэтому gcc командная строка для меня должна быть похожей на это:

gcc file.c -o file -D"PLUGIN_VERSION=\"6.5\"" 

Что означает, что это находится в моем Rakefile:

"-D\"PLUGIN_VERSION=\\\"#{ENV['MY_VERSION']}\\\"\""
6
задан Brian Tompsett - 汤莱恩 11 June 2016 в 21:27
поделиться

2 ответа

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

После системного вызова ядро по-прежнему логически выполняется в контексте той же задачи, что и системный вызов. - он находится только в режиме ядра, а не в пользовательском режиме - это НЕ отдельный поток, и большинство системных вызовов не вызывают логику из другой задачи/потока. Происходит то, что системный вызов вызывает wait_event, wait_event_timeout или какую-либо другую функцию ожидания, которая добавляет задачу в список задач, ожидающих чего-либо, затем переводит задачу в спящий режим, который изменяет ее состояние, и вызывает расписание () для освобождения текущего ЦП.

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

Стоит отметить, что задачи в области пользователя (т.е. потоки) - это только один тип задачи, и есть несколько других внутренних задач ядра, которые также могут работать - это потоки ядра и обработчики нижней половины/tasklets/очереди задач и т.д. Работа, которая не относится к какому-либо конкретному процессу пользовательского пространства (например, обработка сети, например, ответ на эхо-запросы), выполняется в этих процессах. Этим задачам разрешено переходить в спящий режим, в отличие от прерываний (которые не должны вызывать планировщик)

-121--1357741-

Сделайте его работу медленной, во-первых, с чистым модульным кодом.

Если он модульный, можно заменить слой или два, не отказываясь от всего этого.

Хотя они обеспечивают модульность, будьте осторожны с веб-услугами, даже REST, поскольку они имеют тенденцию быть медленными; с каждым соединением, например, связано много накладных расходов.

-121--2953937-

Если я правильно помню, можно использовать параметр командной строки -D с gcc на # определить значение во время компиляции.

т.е.:

$ gcc file.c -o file -D"THE_VERSION_STRING=${THE_VERSION_STRING}"
14
ответ дан 8 December 2019 в 17:21
поделиться

В приведенном ниже коде я хотел бы значение THE_VERSION_STRING должно быть взято из значения переменной окружения MY_VERSION во время компиляции

Нет, вы не можете сделать это так. Единственный способ извлечь переменные среды - во время выполнения с помощью функции getenv () . Вам нужно будет явно извлечь значение и скопировать его в pluginRequires .

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

0
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: