En C, ¿qué significa “público” cuando se coloca ante una variable global?

Estoy revisando el código fuente de la herramienta “menos” de Unix de Mark Nudelman, y el principio de main.c tiene muchos de los siguientes:

public int logfile = -1; public int force_logfile = FALSE; public char * namelogfile = NULL; 

etc. en el ámbito global, antes de la definición de main (),

¿Qué significa público en este contexto? Y más importante, ¿dónde puedo encontrar esta información por mí mismo? Busqué utilizando innumerables combinaciones de consulta y no pude encontrar esta información ni ninguna referencia completa de C.

En el archivo less.h está tu respuesta:

 #define public /* PUBLIC FUNCTION */ 

Parece que público solo se usa como marcador para funciones y variables públicas / globales. Cuando se comstack, se expande a nada.

¿Cómo encontrar esta información?

  1. Busque el archivo .c desde la parte superior hasta la ubicación del identificador sobre el que desea obtener más información.
  2. Si no encuentra ninguna statement, busque las directivas #include
  3. Abra cualquier archivo incluido y busque la statement de lo que está buscando
  4. Repita desde el paso dos para cada archivo incluido

En este caso, eso fue bastante simple.

Esto no tiene nada que ver con C como tal. Si busca en el archivo de inclusión less.h verá que el autor ha definido varias instrucciones del preprocesador. Algunos de ellos como “público” es más probable que sea legible. P.ej:

  /* * Language details. */ #if HAVE_VOID #define VOID_POINTER void * #else #define VOID_POINTER char * #define void int #endif #if HAVE_CONST #define constant const #else #define constant #endif #define public /* PUBLIC FUNCTION */ 

Vea cómo se define el público. Se ha traducido a nada y, como ya se ha dado cuenta, está en el ámbito global. Sin embargo, es más legible y más obvio que está en el ámbito global. Además, se podría argumentar que si la fuente se escribe de forma coherente de esta manera y surge una nueva versión de C que tiene una palabra clave pública , se trata de redefinir el archivo de encabezado y volver a comstackrlo para usarlo realmente.

Los trucos de preprocesamiento de este tipo pueden incluso usarse de manera inteligente para comstackr una fuente en diferentes idiomas (como C ++ y Java). Esto no es algo que debas hacer, pero es posible.

Las opciones como HAVE_VOID que ve en el ejemplo de less.h anterior generalmente se especifican como opciones de comstackdor (en realidad preprocesador) en el tiempo de comstackción. Entonces, si tiene un comstackdor y una versión de C que admite la palabra clave void , comstackría su fuente con:

g ++ -g -DHAVE_VOID -Wall myprog.C -o myprog

En todas partes, el autor usa el comstackdor VOID_POINTER en la fuente como:

 void * 

Si no especificaste HAVE_VOID, el comstackdor usaría

 char * 

que es un sustituto razonable.

CONSEJO: revise las opciones de su comstackdor para ver si tiene una opción para simplemente preprocesar sus fonts. De esa manera, puede ver la fuente real que se envía al comstackdor.

La definición de público como una macro de preprocesador vacía se ha abordado en otras respuestas. Para encontrar la definición, probablemente desee utilizar una herramienta como ctags / etags o cscope. (Hay muchas herramientas para escanear un árbol fuente para generar esta información). Por ejemplo, puede encontrar la definición de público en la línea 55 de less.h invocando:

 $ ctags -dtw * .c * .h
 $ vi -t public

O simplemente ejecute ctags antes de comenzar a editar cualquier cosa. Cuando vea una definición que no comprende, coloque el cursor sobre ella y escriba ^] (eso es el corchete de la derecha de control, y funcionará en editores tipo vi).

C no tiene una palabra clave “pública”, por lo que es probable que se trate de una macro definida en el código fuente inferior en algún lugar.