2015-02-24 75 views
0

我使用ident工具从源文件和编译文件中提取RCS关键字字符串。由gfortran编译的文件没有ident工具的输出

它当然适用于源代码,也适用于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 
+0

你是如何将ID字符串放入代码的?请显示您的来源。 – 2015-02-24 14:04:44

+0

@tkoenig我编辑了问题并添加了fortran源代码 – Masood 2015-02-24 14:18:21

回答

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可能是假的。工程,但更优雅的建议,欢迎。

+0

感谢您的回答,我可以在未打印的代码中的某处使用它吗?因为你知道,它是元数据,不适合在程序的输出中。我在打印中使用了该变量,以便不被编译器删除 – Masood 2015-02-24 14:47:10

相关问题