Хотя разработчики Ады решили не включать в язык директивы поддержки препроцессора, подобные используемым в языке программирования C, GNAT предусматривает препроцессор gnatprep, который позволяет осуществлять условную компиляцию Ада-программ.
Препроцессор gnatprep (GNAT PREProcessor) принимает файл содержащий директивы условной компиляции и генерирует, в результате своей работы, файл с исходным текстом в котором удалены все инструкции, которые не соответствуют условиям указанным в директивах условной компиляции.
Следует обратить внимание на то, что директивы условной компиляции не допускают использования выражений (в отличие от препроцессора языка C).
Таким образом, в директивах условной компиляции могут использоваться только переменные, которые могут принимать значения "истина" (True) или "ложь" (False).
Предположим, что у нас есть файл prepvalues
со следующими определениями для препроцессора:
ALPHAVERSION := True BETAVERSION := False RELEASEVERSION := False TRANSLATION := English |
Предположим также, что у нас есть небольшая программа, текст которой содержит директивы препроцессора gnatprep:
with Text_IO; use Text_IO;
procedure Preptest is -- включить только ту часть кода, которая уместна для этой версии #if ALPHAVERSION S_Version : String := "Alpha"; #elsif BETAVERSION S_Version : String := "Beta"; #elsif RELEASEVERSION S_Version : String := "Release"; #else S_Version : String := "Unknown"; #end if; -- строковой переменной S_Translation будет присваиваться -- значение переменной препроцессора $TRANSLATION S_Translation : String := "$TRANSLATION"; begin Put_Line( "This is the " & S_Version & " edition" ); Put_Line( "This is the " & S_Translation & " translation" ); end Preptest; |
В результате обработки показанной выше программы препроцессором gnatprep, с учетом значений указанных в файле prepvalues, будет получен следующий исходный текст программы: