Как предотвратить удаление препроцессором gcc символа продолжения строки?

#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. Я не хочу изменять исходный код, я ищу изящное решение. На самом деле, я обхожу эту проблему, заменяя символы продолжения строки на указанную строку, затем восстанавливаю ее после препроцессора.