tag ejemplos c comments openbsd

c - ejemplos - meta tags seo



¿Qué significa "@(#)" en los comentarios? (2)

Eso es un marcador para la información de versión de SCCS que busca el programa. Informará lo que sigue hasta uno de una serie de marcadores finales: byte nulo, nueva línea, comillas dobles " , mayor que > y barra diagonal inversa / .

¿Qué es SCCS? Es sinónimo de Source Code Control System, y fue desarrollado por Marc J Rochkind en AT&T (Bell Labs) para Unix. Fue el primer VCS (sistema de control de versiones) basado en Unix ampliamente utilizado, y está estandarizado en POSIX con los comandos admin , delta , get , prs , rmdel , unget y what . La versión clásica (AT&T) incluía los comandos cdc , comb , help (sí, prefirió ese nombre; a veces se llama sccshelp estos días), sact , sccsdiff y val también. Algunos sistemas proporcionaron un programa sccs que, como cvs o git , toma un nombre de comando como su primer argumento. SCCS fue de código cerrado. La comunidad de código abierto utilizó primero RCS y luego CVS , y luego hubo una profusión de otras alternativas, como Git , Subversion , Mercurial , Fossil , Bazaar , ... Puede encontrar al menos dos versiones de código abierto de SCCS: Schily-SCCS y CSSC (una reimplementación de GNU de SCCS), que son en gran medida compatibles con SCCS. SCCS es un VCS centralizado, como RCS y muchos otros sistemas, en contraste con el VCS distribuido (DVCS) como Git. Se espera que haya una versión maestra de los archivos administrados por SCCS almacenados en algún lugar.

En cuanto a por qué @(#) lugar de INFO u otras notaciones, la razón fue precisamente para evitar cualquier mezcla plausible con texto regular. Es muy poco probable que alguna vez tenga motivos para escribir esa secuencia de caracteres que no sea un marcador SCCS.

Lo uso delante de las cadenas RCS $Id$ (que pueden ser rastreadas por separado por ident del paquete RCS). Entonces, por ejemplo, mi programa rmk produce:

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

Me permite ver qué versiones de qué archivos se utilizan para compilar el programa, más información auxiliar marcada con la etiqueta @(#) . Ejecutar en uno de esos archivos de origen, ( stderr.c ), obtengo:

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

El encabezado del archivo se ve así:

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

Las otras cadenas informadas por what aparecen más abajo en el archivo. Una de las líneas en blanco surge de:

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

El marcador allí va seguido de una comilla doble, por lo que el resto de la línea no se informa, se ve como una línea en blanco en la salida. La última línea de la lista es la que está incrustada en el archivo de objeto y, por lo tanto, en los programas que usan el archivo de objeto, como rmk .

En el código de OpenBSD here , hay un comentario que termina con:

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

¿Cuál es el propósito de @(#) ? Supongo que es para facilitar la búsqueda, pero ¿por qué @(#) específicamente y no otro patrón más significativo de caracteres como INFO: :? Sé que no es específico de OpenBSD porque recuerdo haber visto esto antes.


Eso es una reminiscencia del antiguo código de sccs AT&T. Es un sistema antiguo de revisión de código fuente como rcs para mantener diferentes versiones de un archivo (esto fue reemplazado por sistemas que permitieron mantener versiones completas de directorios, como cvs o git ). Hoy en día, ha sido completamente reemplazado por el nuevo software de revisión en uso ... pero estas eran etiquetas para identificar cadenas especiales en el código del objeto. El sistema de versión del código fuente usó esa secuencia como una secuencia de escape introductoria (y rara) que le permitió identificar las cadenas que ve en el código. Estas cadenas permitieron el procesamiento automático de atributos en los archivos de origen, como los que se ven en el código de muestra que se ha publicado en otras respuestas.