web-dev-qa-db-ja.com

コメントの「@(#)」はどういう意味ですか?

OpenBSDコード ここ には、次で終わるコメントがあります:

_@(#)init_main.c 8.9 (Berkeley) 1/21/94
_

@(#)の目的は何ですか?検索を簡単にするためだと思いますが、なぜ@(#)が具体的に、_INFO:_のような別のより意味のある文字パターンではないのでしょうか。以前にこれを見たことを覚えているので、OpenBSD固有ではないことを私は知っています。

25
Benjily3

これは、 what プログラムが検索するSCCSバージョン情報のマーカーです。ヌルバイト、改行、二重引用符_"_、_>_より大きい、バックスラッシュ_\_のいずれかに続くものを報告します。

SCCSとは何ですか?これはSourceCode Control Systemの略で、Unix用のAT&T(Bell Labs)のMarc JRochkindによって開発されました。これは最初に広く使用されたUnixベースのVCS(バージョン制御システム)であり、POSIXでコマンド admindeltagetprsで標準化されています。 rmdelunget および what 。クラシック(AT&T)バージョンには、コマンドcdccombhelp(はい、その名前を横取りしました。最近はsccshelpと呼ばれることもあります)、sactsccsdiffvalも含まれています。一部のシステムは、sccscvsのように、最初の引数としてコマンド名をとるプログラムgitを提供していました。 SCCSはクローズドソースでした。オープンソースコミュニティは、最初に [〜#〜] rcs [〜#〜] 以降 [〜#〜] cvs [〜#〜] を代わりに使用し、その後、他の選択肢がたくさんありました。 GitSubversionMercurialFossilBazaar 、…SCCSのオープンソースバージョンは少なくとも2つあります。 Schily-SCCS および [〜#〜] cssc [〜#〜] (SCCSのGNU再実装)。どちらもSCCSとほぼ互換性があります。 SCCSは、Gitなどの分散VCS(DVCS)とは対照的に、RCSや他の多くのシステムと同様に集中型VCSです。どこかに保存されているSCCS管理ファイルのマスターバージョンがあると予想されます。

INFOやその他の表記の代わりに@(#)を使用する理由については、通常のテキストとのもっともらしい混同を避けるためでした。 SCCSマーカーとして以外に、その一連の文字を書き込む原因になる可能性はほとんどありません。

RCS _$Id$_文字列の前で使用します(RCSパッケージからidentで個別に追跡できます)。したがって、たとえば、私のrmkプログラムは次のようになります。

_$ what rmk
rmk:
    RMK Version 25.92 (2017-10-09)
    *** SCCS enabled ***
    *** RCS enabled ***
    $Id: getopt.h,v 2015.3 2015/09/29 07:13:26 jleffler Exp $
    $Id: stderr.h,v 10.12 2017/04/08 03:43:34 jleffler Exp $
    $Id: sastrings.h,v 2.16 2015/07/05 06:52:05 jleffler Exp $
    $Id: list.h,v 9.6 2016/03/06 18:09:00 jleffler Exp $
    $Id: emalloc.h,v 5.10 2015/02/17 04:50:35 jleffler Exp $
    $Id: debug.h,v 3.13 2016/01/17 15:47:27 jleffler Exp $
    $Id: kludge.h,v 1.16 2016/01/17 15:48:53 jleffler Exp $
    $Id: config.h,v 9.14 2016/09/05 05:37:55 jleffler Exp $
    $Id: make.h,v 9.20 2017/03/28 21:03:36 jleffler Exp $
    $Id: main.c,v 9.20 2016/08/30 22:38:57 jleffler Exp $
    $Id: basename.c,v 2.4 2008/02/11 08:44:50 jleffler Exp $
    $Id: check.c,v 9.6 2016/03/06 07:36:35 jleffler Exp $
    $Id: cleanup.c,v 9.6 2016/08/30 22:38:57 jleffler Exp $
    *** DEBUGGING ENABLED ***
    $Id: debug.c,v 3.12 2016/07/13 00:00:35 jleffler Exp $
    $Id: emalloc.c,v 5.13 2016/01/17 16:05:58 jleffler Exp $
    $Id: errhelp.c,v 8.5 2009/03/02 19:13:51 jleffler Exp $
    $Id: estrdup.c,v 5.7 2015/06/02 03:05:40 jleffler Exp $
    $Id: getopt.c,v 2015.2 2015/09/29 07:13:58 jleffler Exp $
    $Id: input.c,v 9.24 2017/10/09 20:34:18 jleffler Exp $
    $Id: list.c,v 9.4 2015/07/16 00:13:23 jleffler Exp $
    $Id: macro.c,v 9.15 2016/08/30 22:38:57 jleffler Exp $
    $Id: make.c,v 9.12 2017/03/28 21:03:36 jleffler Exp $
    $Id: names.c,v 9.12 2016/08/30 22:38:57 jleffler Exp $
    $Id: rcs.c,v 9.9 2016/08/30 22:38:57 jleffler Exp $
    $Id: rcsfile.c,v 9.9 2016/08/30 22:38:57 jleffler Exp $
    $Id: rules.c,v 9.9 2016/03/06 03:58:52 jleffler Exp $
    $Id: sastrings.c,v 2.22 2015/07/05 06:52:05 jleffler Exp $
    $Id: sccs.c,v 9.11 2016/08/30 22:38:57 jleffler Exp $
    $Id: sccsfile.c,v 9.8 2016/08/30 22:38:57 jleffler Exp $
    $Id: stderr.c,v 10.19 2017/07/10 04:54:26 jleffler Exp $
    $Id: touch.c,v 9.7 2016/03/06 17:31:17 jleffler Exp $
    $Id: vstrcpy.c,v 1.13 2008/02/11 08:44:50 jleffler Exp $
    $Id: archive.c,v 9.11 2017/06/04 04:44:17 jleffler Exp $
    $Id: clnpath.c,v 2.19 2017/03/26 06:32:49 jleffler Exp $
    $Id: dirname.c,v 2.6 2012/02/06 01:55:16 jleffler Exp $
    $Id: tokenise.c,v 2.2 2017/03/26 06:33:37 jleffler Exp $
$
_

これにより、プログラムのビルドに使用されているファイルのバージョンと、@(#)タグでマークされたいくつかの補助情報を確認できます。それらのソースファイルの1つ(_stderr.c_)で実行すると、次のようになります。

_$ what stderr.c
stderr.c:
    File:           $RCSfile: stderr.c,v $
    Version:        $Revision: 10.19 $
    Last changed:   $Date: 2017/07/10 04:54:26 $
    Purpose:        Error reporting routines
    Author:         J Leffler
    Copyright:      (C) JLSS 1988-2017
    Product:        :PRODUCT:


    $Id: stderr.c,v 10.19 2017/07/10 04:54:26 jleffler Exp $
$
_

ファイルの見出しは次のようになります。

_/*
@(#)File:           $RCSfile: stderr.c,v $
@(#)Version:        $Revision: 10.19 $
@(#)Last changed:   $Date: 2017/07/10 04:54:26 $
@(#)Purpose:        Error reporting routines
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 1988-2017
@(#)Product:        :PRODUCT:
*/
_

whatによって報告された他の文字列は、ファイルのさらに下に表示されます。空白行の1つは、次の原因で発生します。

_#if defined(USE_STDERR_FILEDESC)
extern const char jlss_id_stderr_c_with_filedesc[];
const char jlss_id_stderr_c_with_filedesc[] =
        "@(#)" __FILE__ " configured with USE_STDERR_FILEDESC";
#endif /* USE_STDERR_FILEDESC */
_

そこにあるマーカーの後に二重引用符が続くため、残りの行は報告されません。出力では空白行のように見えます。最後にリストされている行は、オブジェクトファイルに埋め込まれている行であるため、rmkなどのオブジェクトファイルを使用するプログラムに埋め込まれています。

32

これは、古いAT&T sccsコードを彷彿とさせます。これは古いソースコード改訂システムファイルのさまざまなバージョンを維持するためのrcsのようなものです(これは、cvsgit)。現在、使用されている新しいリビジョンソフトウェアに完全に取って代わられています...しかし、これらはオブジェクトコード内の特別な文字列を識別するためのラベルでした。ソースコードバージョンシステムは、そのシーケンスをいくつかの導入(およびまれな)エスケープシーケンスとして使用し、コードに表示される文字列を識別できるようにしました。これらの文字列により、他の回答で投稿されたサンプルコードに見られるような、ソースファイル内の属性の自動処理が可能になりました。

4
Luis Colorado