¿Cuál es el propósito de un solo signo de libra / hash (#) en su propia línea en el preprocesador C / C ++?

145

He estado mirando el código fuente de las bibliotecas Boost , y he notado que a menudo hay signos de una sola libra sin ninguna directiva de preprocesador adjunta. Leí el manual del preprocesador GCC y la guía de especificaciones y no puedo encontrar nada al respecto.

(1) #ifndef BOOST_CONFIG_HPP
(2) #  include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) #  pragma once
(7) #endif

En la línea 4, no hay nada después del signo de libra. ¿Qué efecto tiene esto? ¿Está definido en la especificación del preprocesador C (CPP)?

Como Boost es una biblioteca multiplataforma, supongo que cualquier CPP debería analizarla correctamente. ¿Cuál sería el efecto / efectos secundarios de tener signos aleatorios de libra / hash en todo el código?

callyalater
fuente
66
@Zaibis Eg. el nombre ejecutable del preprocesador en la suite GCC es "cpp" (mientras que los compiladores son gcc y g ++)
deviantfan
3
CPP significa C-Plus-Plus.
djeidot
66
No completamente. Vea la primera oración de en.wikipedia.org/wiki/C_preprocessor
P45 Inminente
77
@djeidot "cpp" es ambiguo. Es por eso que las personas usan "c ++" o "cxx" (x parece + convertido 45 grados) cuando se refieren a C-Plus-Plus.
Mike Ounsworth
12
@djeidot No, CPP es el C-PreProcessor. Existía mucho antes de que C ++ existiera.
Leandros

Respuestas:

185

Una #sola en una línea no tiene ningún efecto. Supongo que se está utilizando por valor estético.

El estándar C dice:

6.10.7 Directiva nula

Semántica

Una directiva de preprocesamiento del formulario

# new-line

no tiene efecto.

El estándar C ++ dice lo mismo:

16.7 Directiva nula [cpp.null]

Una directiva de preprocesamiento del formulario

# new-line

no tiene efecto.

Jonathan Wakely
fuente
44
Sin embargo, esto no explica el propósito de usarlo, ni da la razón de su existencia.
StellarVortex
8
"¿Qué efecto tiene esto? ¿Está definido en la especificación del preprocesador C (CPP)? ... ¿Cuál sería el efecto / efectos secundarios de tener signos aleatorios de libra / hash en todo el código?" Eso fue lo que respondí. No tiene ningún efecto, pero no quería especular sobre la razón del autor para usarlo. Lo he hecho ahora.
Jonathan Wakely
Se le han dado respuestas correctas de que no significa nada para el preprocesador; Voy a especular que puede ayudar a algún otro programa (como un IDE o LINT) a mantener un bloque de directivas juntas como una unidad lógica. Algunos IDE permiten a los programadores expandir o contraer bloques de texto para ayudarlos a realizar un seguimiento de la estructura lógica del archivo.
Spencer
107

Hace que el código fuente se vea bonito, eso es todo.

Destaca el hecho de que todo el bloque es una sección de preprocesador.

Y, de hecho, los preprocesadores C y C ++ deben ignorar #en una línea.

P45 inminente
fuente
16
Y también facilita la navegación en algunos editores de texto (por ejemplo, {o }en vim).
wchargin
@WChargin, eso depende de cómo lo veas. Si desea navegar entre los dos bloques del preprocesador, agregar #evitaría que use {o }. De hecho, puede ser más fácil presionar }dos veces para saltar sobre el bloque (en el ejemplo del OP) que no poder saltar al medio de los dos bloques.
Shahbaz
3
@Shahbaz ¡Ciertamente! Mi regla de oro es "mantener unidas las unidades lógicas", de modo que "párrafo" realmente signifique "idea". También seguiría esta regla con declaraciones de preprocesador. Por supuesto, es una cuestión de estilo personal en gran medida.
wchargin
46

Siempre verifique una fuente autorizada en lugar de depender de otros recursos. C está estandarizado como ISO 9899 :: 2011, C ++ también tiene un estándar ISO. Ambos son bien aceptados y los borradores finales están disponibles mediante una breve búsqueda. El estándar C indica en 6.10.7 (C ++ tiene el mismo texto):

Una directiva de preprocesamiento del formulario

# new-line

no tiene efecto.

Esta es una directiva nula , tanto como una ;sin una expresión anterior en el lenguaje central es una declaración nula .

Para el preprocesador es solo para formatear / legibilidad resaltar que las líneas pertenecen semánticamente juntas. (el punto y coma OTOH es semánticamente relevante).

demasiado honesto para este sitio
fuente