我在#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}}
答案 0 :(得分:2)
省略-C
选项似乎会禁止插入的版权信息。
' - C'
不要丢弃评论。所有评论都传递给了 输出文件,处理指令中的注释除外 与指令一起删除。使用'-C'时,您应该为副作用做好准备;它导致 预处理器将注释视为标记本身。 例如,评论出现在什么的开头 指令行具有将该行转换为 普通的源代码行,因为行上的第一个令牌是否定的 更长的'#'。
默认情况下,源代码中的注释被丢弃。 -C
选项会导致它们通过。显然,在最近的版本中,它还会插入该版权信息。
这个可能有其他影响,无论好坏。如果-C
之前正在为您工作,那么您的OCaml代码中的某些内容可能会被传递出来
lexer.mll
至lexer_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
使用。