2017-11-20 1 views
24

Im OpenBSD-Code here gibt es einen Kommentar, der mit endet:Was bedeutet "@ (#)" in Kommentaren?

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

Was ist der Zweck der @(#)? Ich würde annehmen, dass es die Suche zu erleichtern ist, aber warum @(#) speziell und nicht ein anderes aussagekräftigeres Zeichenmuster wie INFO:? Ich weiß, dass es nicht OpenBSD-spezifisch ist, weil ich mich erinnere, das vorher gesehen zu haben.

Antwort

31

Das ist ein Marker für SCCS Versionsinformationen, die das what Programm sucht. Es berichtet, was bis zu einem aus einer Anzahl von Endmarkierungen folgt: Nullbyte, Zeilenumbruch, Doppelzitat ", größer als > und Backslash \.

Was ist SCCS? Es steht für Source Code Control System und wurde von Marc J Rochkind bei AT & T (Bell Labs) für Unix entwickelt. Es war der erste weit verbreitete Unix-basierte VCS (Version Control System) und wird in POSIX mit den Befehlen admin, delta, get, prs, rmdel, unget und what standardisiert. Die klassische (AT & T) Version enthalten Befehle cdc, comb, help (ja, es diesen Namen vorbelegt, es ist manchmal sccshelp in diesen Tagen genannt), sact, sccsdiff und val auch. Einige Systeme haben ein Programm sccs bereitgestellt, das wie cvs oder git einen Befehlsnamen als erstes Argument verwendet. SCCS wurde geschlossen Quelle. Die Open-Source-Community verwendete erste RCS und später CVS statt, und später gibt es eine Fülle von anderen Alternativen, wie Git, Subversion, Mercurial, Fossil, Bazaar, ... Sie mindestens zwei Open-Source-Versionen von SCCS finden: Schily-SCCS und CSSC (eine GNU-Reimplementierung von SCCS), die beide weitgehend kompatibel mit SCCS sind. SCCS ist ein zentralisiertes VCS, wie RCS und viele andere Systeme, im Gegensatz zu verteilten VCS (DVCS) wie Git. Es wird erwartet, dass eine Master-Version der SCCS-verwalteten Dateien irgendwo gespeichert wird.

Warum @(#) anstelle von INFO oder andere Notationen, der Grund war genau, um jede plausible Verwechslung mit normalem Text zu vermeiden. Es ist sehr unwahrscheinlich, dass Sie jemals einen Grund haben, diese Zeichensequenz anders als als SCCS-Marker zu schreiben.

Ich benutze es vor RCS $Id$ Strings (die separat von ident aus dem RCS-Paket verfolgt werden können). So zum Beispiel, mein rmk Programm ergibt:

$ 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 $ 
$ 

Es erlaubt mir, um zu sehen, welche Versionen von denen Dateien verwendet werden, um das Programm zu bauen, sowie einige Hilfsinformationen, die mit dem @(#) Tag markiert sind. Führen Sie auf einem dieser Quelldateien (stderr.c), erhalte ich:

$ 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 $ 
$ 

Die Überschrift der Datei wie folgt aussieht:

/* 
@(#)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: 
*/ 

Die anderen von what berichtet Strings weiter unten in der Datei angezeigt werden.Einer der Leerzeilen ergibt sich aus:

#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 */ 

Der Marker dort mit einem doppelten Anführungszeichen gefolgt wird, so dass der Rest der Zeile ist nicht — berichtet es wie eine leere Zeile in der Ausgabe aussieht. Die letzte aufgelistete Zeile ist diejenige, die in der Objektdatei eingebettet ist, und daher in Programmen, die die Objektdatei verwenden, z. B. rmk.

3

Das ist eine Reminiszenz an den alten Code AT & T sccs. Das ist ein altes Quellcode-Revisionssystem wie rcs, um verschiedene Versionen einer Datei zu pflegen (dies wurde durch Systeme ersetzt, die es erlaubten, ganze Verzeichnisversionen zu behalten, wie cvs oder git). Heutzutage wurde es vollständig durch die neue Revisionssoftware ersetzt ... aber diese waren Etiketten, um spezielle Zeichenketten im Objektcode zu identifizieren. Das Quellcodeversionssystem verwendete diese Sequenz als eine einleitende (und seltene) Escape-Sequenz, die es ermöglichte, die Zeichenfolgen zu identifizieren, die Sie im Code sehen. Diese Zeichenfolgen ermöglichen die automatische Verarbeitung von Attributen in den Quelldateien, wie sie im Beispielcode in anderen Antworten angezeigt werden.