【问题标题】:What does "@(#)" in comments mean?评论中的“@(#)”是什么意思?
【发布时间】:2018-05-04 07:10:41
【问题描述】:

在OpenBSD代码here中,有一条注释以:

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

@(#) 的用途是什么?我认为这是为了使搜索更容易,但为什么是 @(#) 而不是像 INFO: 这样的另一个更有意义的字符模式?我知道它不是 OpenBSD 特有的,因为我记得以前见过。

【问题讨论】:

    标签: c comments openbsd


    【解决方案1】:

    这是what 程序查找的SCCS 版本信息的标记。它将报告多个结束标记之一之后的内容:空字节、换行符、双引号"、大于> 和反斜杠\

    什么是 SCCS?它代表源代码控制系统,由 AT&T(贝尔实验室)的 Marc J Rochkind 为 Unix 开发。它是第一个广泛使用的基于 Unix 的 VCS(版本控制系统),并在 POSIX 中通过命令admindeltagetprsrmdelunget 和@987654328 进行了标准化@。经典 (AT&T) 版本包括命令cdccombhelp(是的,它抢占了这个名称;现在有时称为sccshelp)、sactsccsdiffval也。一些系统提供了一个程序sccs,就像cvsgit,将命令名称作为它的第一个参数。 SCCS 是封闭源代码。开源社区首先使用RCS,后来使用CVS,后来出现了很多其他替代方案,例如GitSubversionMercurialFossilBazaar……可以找到至少两个 SCCS 的开源版本:Schily-SCCSCSSC(SCCS 的 GNU 重新实现),它们都在很大程度上与 SCCS 兼容。 SCCS 与 RCS 和许多其他系统一样,是一个集中式 VCS,与 Git 等分布式 VCS (DVCS) 不同。预计会有一个主版本的 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-02-09
        • 2011-03-29
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2017-06-11
        相关资源
        最近更新 更多