【问题标题】:No output of ident tool on compiled file by gfortrangfortran 在编译文件上没有 ident 工具的输出
【发布时间】:2015-04-26 04:24:30
【问题描述】:

我使用 ident 工具从源文件和编译文件中提取 RCS 关键字字符串。

它当然适用于源代码,也适用于 GCC 的 C 编译输出以及 G77 的 fortran 编译输出。

$ gcc -o c.out test.c
$ ident test.c c.out 
test.c:
     $Id: 63159761756 $

c.out:
     $Id: 63159761756 $


$ g77 -o g77.out test.f
$ ident test.f g77.out 
test.f:
     $Id: 63159761756 $

g77.out:
     $Id: 63159761756 $

问题是当我使用 gfortran 编译器编译 fortran 代码时。 ident工具在编译后的代码中找不到RCS关键字,什么都不返回!

$ gfortran -o gf.out test.f
$ ident test.f gf.out 
test.f:
     $Id: 63159761756 $

gf.out:

那么,gfortran 有什么问题?是否有任何操纵变量的优化,或者 ident 工具不再能够解析 gfortran 的编译输出?

请问我该如何解决这个问题?

编辑:

Fortran 源代码:

  PROGRAM HELLO
    CHARACTER*80 ID
    ID =
 *'@(#)$Id: 63159761756 $'
    PRINT '(A)', 'Hello,fortran 77'
    Print *, 'ID is ', ID
    STOP
  END

【问题讨论】:

  • 你是如何将ident字符串放入代码中的?请显示您的来源。
  • @tkoenig 我编辑了问题并添加了fortran源代码

标签: compiler-errors fortran gfortran g77 ident


【解决方案1】:

使用字符串常量,如

  PROGRAM HELLO
  PRINT '(A)', 'Hello,fortran 77'
  Print *, 'ID is ',
 +'@(#)$Id: ident.f,v 1.2 2015/02/24 14:20:49 ig25 Exp ig25 $'
  STOP
  END

您必须确保以某种方式使用它,否则它可能会被删除。

编辑

您必须在某个地方使用它,以使编译器无法看到它实际上是无用的。目前我能看到的唯一方法是有点可怕的黑客攻击,但无论如何......

  PROGRAM HELLO
  logical, volatile :: print_it = .false.
  PRINT '(A)', 'Hello,fortran 77'
  if (print_it) then
  Print *, 'ID is ',
 +'@(#)$Id: ident.f,v 1.2 2015/02/24 14:20:49 ig25 Exp ig25 $'
  end if
  STOP
  END

在这里,您告诉带有 volatile 声明的编译器永远不要假设 print_it 可能为假。有效,但欢迎提出更优雅的建议。

【讨论】:

  • 感谢您的回答,我可以在未打印的代码中的某处使用它吗?因为你知道,它是元数据,不适合出现在程序的输出中。我在打印中使用了变量,以免被编译器删除
猜你喜欢
  • 2018-03-23
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多