在OpenBSD代码here中,有一个注释以结尾:
@(#)init_main.c 8.9 (Berkeley) 1/21/94
@(#)
的作用是什么?我认为这样做是为了简化搜索,但是为什么要专门使用@(#)
而不是像INFO:
这样的更有意义的字符模式呢?我知道它不是特定于OpenBSD的,因为我记得以前曾经看过。 最佳答案
这是 what
程序寻找的SCCS版本信息的标记。它将报告后续的多个结束标记之一:空字节,换行符,双引号"
,大于>
和反斜杠\
。
什么是SCCS?它代表源代码控制系统,由AT&T(贝尔实验室)的Marc J Rochkind针对Unix开发。它是第一个广泛使用的基于Unix的VCS(版本控制系统),并且在POSIX中使用 admin
, delta
, get
, prs
, rmdel
, unget
和 what
命令进行了标准化。经典(AT&T)版本包括命令cdc
,comb
和help
(是的,它抢占了该名称;如今,有时也称为sccshelp
),sact
,sccsdiff
和val
。某些系统提供了sccs
程序,例如cvs
或git
,它以命令名作为第一个参数。 SCCS是封闭源。开源社区首先使用了RCS,后来使用了CVS,后来又出现了许多其他选择,例如Git,Subversion,Mercurial,Fossil,Bazaar………您至少可以找到两个SCCS的开源版本:Schily-SCCS和CSSC (SCCS的GNU重新实现),两者在很大程度上都与SCCS兼容。与RCS和许多其他系统一样,SCCS是集中式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
。关于c - 评论中的 “@(#)”是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47402634/