【问题标题】:Clang line directiveClang 行指令
【发布时间】:2015-07-10 23:56:33
【问题描述】:

我正在编写一个输出 C++ 代码的语法转换器,但遇到了一个有趣的问题。假设我有两个文件:ln.xln.cpp。在ln.x

abc

ln.cpp:

#line 1 "ln.x"
(

当我尝试使用 GCC 编译它时,它会在 ln.x 中打印相应的行:

ln.x:1:1: error: expected unqualified-id at end of input
 abc
 ^
ln.x:1:1: error: expected ‘)’ at end of inpu

但是,Clang 只是打印同一文件的行:

ln.x:1:2: error: expected unqualified-id
(
 ^
ln.x:1:2: error: expected ')'
ln.x:1:1: note: to match this '('
(
^
2 errors generated.

有没有办法让 Clang 像 GCC 一样打印文件的行?

【问题讨论】:

  • 这没有多大意义。据我所知,编译器完全有理由抱怨,因为只包含一个左括号的文件不是有效的 C++。
  • 您希望实现什么目标?那不是 C++ 代码,那么“绕过这个”是什么意思?
  • @DrewDormann 我澄清了我的问题。
  • 赞成,因为这是一个简单但有趣的问题。 @downvoters:请不要对您不理解的其他问题投反对票。
  • @close-voters:请不要因为无知而投票关闭。不理解这个问题并不意味着你有资格投票结束。这意味着相反,你不合格。

标签: c++ gcc g++ clang clang++


【解决方案1】:

这看起来更像是一个错误而不是一个功能。你为什么要它?

#line 指定的文件打印仅在该行与被解析的文本匹配时才有效,逐个字符。如果文件首先存在。

我在 GCC 预处理器手册(GCC 4.9 版)中没有看到任何关于此的内容。但是,有一个注意事项,曾几何时(直到 2001 年),GCC 会假设命名文件确实存在于本地,或者至少存在其父目录。这可能是一个保留错误。

而且,不,没有办法让 Clang 做到这一点。它没有尝试打开以#line命名的文件的概念。

【讨论】:

    【解决方案2】:

    所以,由于这似乎不可能,我写了一个Perl script to wrap Clang and rewrite the error lines。有点骇人听闻,但现在已经足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      相关资源
      最近更新 更多