[英]What does “@(#)” in comments mean?
在這里的OpenBSD代碼中,有一條注釋以下結尾:
@(#)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很大程度上兼容。 與分布式VCS(DVCS)(如Git)相比,SCCS是集中式VCS,如RCS和許多其他系統。 預計存儲在某處的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
。
這是舊AT&T sccs
代碼的回憶。 這是一個舊的源代碼修訂系統,如rcs
用於維護文件的不同版本(這被允許維護整個目錄版本的系統所取代,如cvs
或git
)。 如今,它已被完全取代了正在使用的新版本軟件......但這些是用於識別目標代碼中特殊字符串的標簽。 源代碼版本系統使用該序列作為一些介紹性(和罕見的)轉義序列,允許它識別您在代碼中看到的字符串。 這些字符串允許自動處理源文件中的屬性,就像您在其他答案中發布的示例代碼中看到的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.