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