@anchor{Quoting}
Макросы, которые вызываются другими макросами оцениваются программой
m4 несколько раз; каждая оценка может потребовать другого уровня
кавычек для предотвращения нежелательных расширений макросов или
встроенных возможностей m4, таких как `define' и
`$1'. Кавычки также требуются вокруг аргументов макросов, которые
содержат запятые, поскольку запятые разделяют аргументы макроса. Также
хорошей привычкой является заключение в кавычки аргументов, которые
содержат символы новой строки или вызовы других макросов.
Autoconf изменяет символ-кавычку программы m4 со значений по
умолчанию ``' и `'' на `[' и `]', поскольку многие
из макросов используют не сочетаемые ``' и `''. Однако в
нескольких местах макросам необходимо использовано символов-скобок
(обычно в тексте программ на языке C или в регулярных выражениях). В
этих местах макросы используют встроенную команду m4
changequote для временного изменения символа-кавычек на `<<'
и `>>'. (Иногда, если им нет нужды заключать в кавычки что-либо, то
они запрещают заключение в кавычки установкой символов-кавычек равных
пустым символам). Вот пример использования:
AC_TRY_LINK( changequote(<<, >>)dnl <<#include <time.h> #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ #endif>>, changequote([, ])dnl [atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
Когда вы создает скрипт configure, используя свеже написанные
макросы, то тщательно проверьте их на то, нужно ли добавить
дополнительные символы-кавычки в эти макросы. Если одно или несколько
слов исчезнут в выводе m4, то вам необходимо добавить
дополнительные символы-кавычки. Если вы сомневаетесь, то просто добавьте
кавычки.
Однако также возможно поместить слишком много уровней кавычек. Если это
случается, то полученный скрипт configure будет содержать
не-расширенный макрос. Программа autoconf выполняет проверку этой
проблемы, выполняя команду `grep AC_ configure'.
Go to the first, previous, next, last section, table of contents.