评论中的“@(#)”是什么意思?

时间:2017-11-20 23:09:27

标签: c comments openbsd

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

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

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

2 个答案:

答案 0 :(得分:33)

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

是什么 SCCS?它代表源代码控制系统,由AT& T(贝尔实验室)的Marc J Rochkind为Unix开发。它是第一个广泛使用的基于Unix的VCS(版本控制系统),并在POSIX中使用命令admindeltagetprs,{{进行标准化。 3}},rmdelunget。经典(AT& T)版本包括命令cdccombhelp(是的,它抢占了该名称;这些日子有时被称为sccshelp),{ {1}},sactsccsdiff也是如此。有些系统提供了一个程序val,它与sccscvs一样,将命令名作为其第一个参数。 SCCS是封闭源。开源社区首先使用what和更晚RCS,之后又有大量其他选择,例如CVSGitSubversionMercurialFossil,...您可以找到至少两个SCCS的开源版本:BazaarSchily-SCCS(SCCS的GNU重新实现),它们在很大程度上兼容SCCS。与分布式VCS(DVCS)(如Git)相比,SCCS是集中式VCS,如RCS和许多其他系统。预计存储在某处的SCCS管理文件的主版本。

至于为什么git而不是@(#)或其他符号,原因恰恰是避免使用常规文本进行任何合理的混音。除了作为SCCS标记之外,您不可能有理由编写该字符序列。

我在RCS INFO字符串前面使用它(可以从RCS包中单独跟踪$Id$)。因此,例如,我的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 */

答案 1 :(得分:4)

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