删除cpp生成的注释

时间:2014-08-14 18:07:34

标签: gcc ocaml c-preprocessor

我在#include ".../frontend/tokens.mll"中使用lexer.mll,然后cpp -C -P frontend/lexer.mll -o frontend/lexer_new.mll使用lexer_new.mll生成ocamllex frontend/lexer_new.mll File "frontend/lexer_new.mll", line 1, character 1: illegal character /. make: *** [frontend/lexer_new.ml] Error 3

直到昨天我的ubuntu从12.04升级到14.04才有效。

编译出错:

lexer_new.mll

这是因为在/* Copyright (C) 1991-2014 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. ... */ 开头插入了几行C评论:

gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

我不记得在升级之前是否生成了相同的评论。

有谁知道如何获取这些评论?

PS:gcc版本为:{{1}}

3 个答案:

答案 0 :(得分:2)

省略-C选项似乎会禁止插入的版权信息。

来自documentation

  

' - C'
   不要丢弃评论。所有评论都传递给了    输出文件,处理指令中的注释除外    与指令一起删除。

     

使用'-C'时,您应该为副作用做好准备;它导致    预处理器将注释视为标记本身。    例如,评论出现在什么的开头    指令行具有将该行转换为    普通的源代码行,因为行上的第一个令牌是否定的    更长的'#'。

默认情况下,源代码中的注释被丢弃。 -C选项会导致它们通过。显然,在最近的版本中,它还会插入该版权信息。

这个可能有其他影响,无论好坏。如果-C之前正在为您工作,那么您的OCaml代码中的某些内容可能会被传递出来 lexer.mlllexer_new.mll;省略-C会导致删除它们。如果这是一个问题,您可能希望保留-C选项并在删除添加的注释的预处理器之后添加过滤器。 (编写这样的过滤器留作练习。)

更多信息:正在运行

cpp -C /dev/null

表示版权评论来自/usr/include/stdc-predef.h

$ cpp -C /dev/null
# 1 "/dev/null"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
[39 lines deleted]
# 1 "/dev/null"
$

-P选项禁止指示文本来自何处的#指令。)显然,在预处理C源时,默认包含该文件。它定义了一些特定于C的预定义宏,例如__STDC_IEC_559____STDC_ISO_10646__

为什么使用-C表示非C代码?

答案 1 :(得分:2)

我最近遇到了这个问题(它实际上更复杂,但归结为这些问题),并在CPP/GPP in Fortran variadic macro (plus Fortran // concatenation)

中描述了它及其解决方案

简而言之,修复是安装旧版本的cpp,我学到的可以轻松完成而无需使用以前版本的编译器。

在ubuntu 16.04上

\b(En|Fr|De|Es|It)\b

然后使用

sudo apt-get install cpp-4.7

答案 2 :(得分:0)

您可以将cpp与标志-nostdinc一起使用,而不能将标志-C使用。