Что означает "@ ( # ) " в комментариях?

в OpenBSD в код здесь, есть комментарий, который заканчивается:

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

какова цель @(#)? Я бы предположил, что это сделать поиск проще, но почему @(#) конкретно, а не другой, более значимый шаблон символов типа INFO:? Я знаю, что это не OpenBSD, потому что я помню, что видел это раньше.

2 ответов


это маркер для информации о версии SCCS, что what программа ищет. Он сообщит, что следует за одним из нескольких конечных маркеров: null byte, newline, double quote ", больше > и слеш \.

что is SCCS? Он расшифровывается как система управления исходным кодом и был разработан Marc J Rochkind at & T (Bell Labs) для Unix. Это был первый широко используемый Unix-based VCS (система управления версиями), и стандартизирован в POSIX с командами admin, delta, get, prs, rmdel, unget и what. Классическая (AT&T) версия включала команды cdc, comb, help (да, он опередил это имя; его иногда называют sccshelp в эти дни), sact, sccsdiff и val тоже. В некоторых системах предусмотрена программа sccs, что нравится cvs или git, принимает имя команды в качестве первого аргумента. SCCS был закрытым источником. Сообщество с открытым исходным кодом использовало first RCS и позже CVS вместо этого, а позже было изобилие других альтернатив, таких как Git, в Subversion, ртутный, ископаемых, базар, ... вы можете найти по крайней мере две версии SCCS с открытым исходным кодом: Schily-SCCS и CSSC (переосмысление GNU SCCS), которые в значительной степени совместимы с SCCS. SCCS является централизованным VCS, как RCS и многие другие системы, в отличие от распределенных VCS (DVCS), таких как Git. Ожидается, что где-то будет храниться основная версия управляемых SCCS файлов.

, почему @(#) вместо INFO или другие обозначения, причина заключалась именно в том, чтобы избежать любой вероятной путаницы с обычным текстом. Это очень маловероятно, что вы когда-либо причина для записи этой последовательности символов, отличной от маркера SCCS.

я использую его перед RCS $Id$ строк (которые могут быть отслежены ident из пакета RCS). Так, например, my 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), I получить:

$ 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). В настоящее время, он был полностью заменен новым программным обеспечением пересмотра в пользе... но это были метки для идентификации специальных строк в объектном коде. Система версий исходного кода использовала эту последовательность как некоторая вводная (и редкая) escape-последовательность, которая позволила ей идентифицировать строки, которые вы видите в коде. Эти строки позволяют автоматически обрабатывать атрибуты в исходных файлах, как в примере кода, опубликованном в других ответах.