如何防止gcc预处理器删除行继续符?

时间:2014-07-05 12:10:28

标签: c gcc c-preprocessor

假设有一个这样的文件(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时遇到了类似的情况:Emacs 22.1中的makefile由C预处理器处理。

我的操作系统是Ubuntu 14.04,gcc版本是4.8.2

我通过将行继续符替换为指定字符串来绕过此问题,然后在预处理器之后将其还原。我正在寻找一个“优雅”的解决方案。

2 个答案:

答案 0 :(得分:3)

也许gcc&#39; s traditional preprocessor mode会奏效。试试gcc -E -traditional

它不会完全按照你的要求行事;它将加入这些行,以便:

all: obj1 \
  obj2 \
  obj3

变为:

all: obj1 obj2 obj3

但是那个输出仍然是一个有效的Makefile。

传统模式有another advantage for Makefiles

  

输入文件中的水平空格形式保留在   输出。特别是,硬标签仍然是硬标签。这可以   例如,如果您正在预处理Makefile,则非常有用。

Makefile可能是为这种模式设计的。

答案 1 :(得分:1)

也许你可以在每一个前面加上另一个反斜杠? 我不确定,但它可以解决你的问题。

all: obj1 \\
  obj2 \\
  obj3