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


He estado mirando el código fuente de las bibliotecas Boost, y he notado que a menudo hay signos de libra individuales sin ninguna directiva de preprocesador adjunta a ellos. He leído el manual del preprocesador de 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, me gustaría supongamos que cualquier CPP debe analizarlo correctamente. ¿Cuál sería el efecto / efectos secundarios de tener signos aleatorios de libra / hash en todo el código?

Author: Peter Mortensen, 2016-02-04

3 answers

Un # por sí solo en una línea no tiene ningún efecto. Supongo que está siendo usado 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 de la formulario

# new-line

No tiene efecto.

 181
Author: Jonathan Wakely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-09 19:50:56

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

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

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

 107
Author: P45 Imminent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 17:22:54

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 establece en 6.10.7 (C++ tiene casi 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 core-language hay una sentencia null .

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).

 44
Author: too honest for this site,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 03:35:38