0

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
4

1 に答える 1

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 が false である可能性があると想定しないようにコンパイラに指示します。機能しますが、よりエレガントな提案を歓迎します。

于 2015-02-24T14:26:42.107 に答える