"@(#)"在注释中是什么意思?

26
在OpenBSD的代码这里,有一个以以下内容结尾的注释:
@(#)init_main.c 8.9 (Berkeley) 1/21/94
< p > @ (#)的目的是什么?我认为它的目的是使搜索更容易,但为什么要选择@ (#)而不是像INFO:这样更有意义的字符模式?我知道它不是OpenBSD特定的,因为我之前见过这种用法。


目的是什么?选择@ (#) 而不是 INFO: 等更有意义的字符模式。
2个回答

33
那是 SCCS 版本信息的标记,what 程序会查找它。程序会报告接下来的内容,直到出现以下其中一个结束标记:空字节、换行符、双引号 "、大于号 > 和反斜杠 \

什么是SCCS?它代表源代码控制系统,由Marc J Rochkind在Unix的AT&T(贝尔实验室)开发。它是第一个广泛使用的基于Unix的版本控制系统(VCS),并与POSIX标准化,具有admin, delta, get, prs, rmdel, ungetwhat命令。经典(AT&T)版本还包括命令cdccombhelp(是的,它抢先使用了那个名称;现在有时称为sccshelp),sactsccsdiffval等。一些系统提供了一个程序sccs,类似于cvsgit,其将命令名称作为其第一个参数。SCCS是闭源的。开源社区使用首先是RCS,后来是CVS,然后是其他许多替代方案,如GitSubversionMercurialFossilBazaar等。您可以至少找到两个开源版本的SCCS:Schily-SCCSCSSC(SCCS的GNU重新实现),它们都基本兼容SCCS。SCCS是集中式VCS,类似于RCS和许多其他系统,与分布式VCS(DVCS)如Git相反。预计会有存储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 $
$

它允许我查看用于构建程序的哪些文件的哪些版本,以及一些带有@(#)标记的辅助信息。在其中一个源文件(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 报告的其他字符串出现在文件的更下方。其中一个空行来自于:

#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)中也是如此。


5

这是对旧AT&T sccs代码的回忆。那是一种旧的源代码修订系统,像rcs一样用于维护文件的不同版本(已被允许维护整个目录版本的系统所取代,如cvsgit)。现在,它已经完全被新的修订软件所取代……但这些标签是为了识别目标代码中的特殊字符串。源代码版本系统将该序列用作某些介绍性(且罕见的)转义序列,以便能够识别您在代码中看到的字符串。这些字符串允许自动处理源文件中的属性,例如您在其他答案中发布的示例代码中所看到的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接