#c #gcc #c-preprocessor
#c #gcc #c-препроцессор
Вопрос:
Предположим, что существует файл (1.c), подобный этому:
all: obj1
obj2
obj3
Обработайте этот файл препроцессором gcc следующим образом:
gcc -E 1.c
# 1 "1.c"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "1.c"
all: obj1
obj2
obj3
Все символы продолжения строки (») были удалены.
Есть ли возможность сохранить символы продолжения строки в gcc?
Приведенный выше файл не является допустимой программой на C, я беру его только в качестве примера. Я встречаю действительно похожий случай при сборке Emacs 22.1: makefile в Emacs 22.1 обрабатывается препроцессором C.
Моя ОС — Ubuntu 14.04, версия gcc — 4.8.2
Я обхожу эту проблему, заменяя символы продолжения строки на указанную строку, затем восстанавливаю ее после препроцессора. Я ищу «изящное» решение.
Комментарии:
1. Почему такая старая версия Emacs?
2. Просто для чтения его исходного кода.
3. вы пробовали два из них? `\`, очень сложно показать 2, анализатору комментариев это не нравится
4.
imake
Команда, используемая с X11, использует препроцессор C для управления make-файлами. Он использует специальное обозначение с@@
в концах строк, чтобы обойти проблемы с тем, как препроцессор C обрабатывает входные данные. В принципе, препроцессор C был разработан для предварительной обработки C, а не make-файлов, и он ведет себя соответствующим образом для исходного кода C, не обязательно для make-файлов. Учитывая, что C является языком свободной формы и эти обратные косые черты отображаются вне строковых литералов, нет необходимости в C для этих обратных косых черт. Добавьте строку, разделенную на две строки, и поведение препроцессора изменится.5. @gradyplayer Специальное обозначение @@ является допустимым символом продолжения в imake?
Ответ №1:
Возможно, традиционный режим препроцессора gcc будет работать. Попробуйте gcc -E -traditional
.
Он не совсем выполнит то, о чем вы просили; он соединит строки, так что:
all: obj1
obj2
obj3
становится:
all: obj1 obj2 obj3
Но этот вывод по-прежнему является допустимым файлом Makefile.
Традиционный режим имеет еще одно преимущество для Makefile-файлов:
Форма горизонтального пробела во входном файле сохраняется в выходных данных. В частности, жесткие вкладки остаются жесткими вкладками. Это может быть полезно, если, например, вы выполняете предварительную обработку Makefile.
Вероятно, Makefile был разработан для этого режима.
Ответ №2:
Может быть, вы можете поместить другую обратную косую черту перед каждым из них?
Я не уверен, но это могло бы решить вашу проблему.
all: obj1 \
obj2 \
obj3
Комментарии:
1. Может потребоваться три обратных косых черты. Первый экранирует второй, а третий экранирует новую строку.
2. Я не хочу изменять исходный код, я ищу изящное решение. На самом деле, я обхожу эту проблему, заменяя символы продолжения строки на указанную строку, затем восстанавливаю ее после препроцессора.