I zostały patrząc na Boost kodu źródłowego biblioteki, a ja zauważyłem, że często nie są to pojedyncze znaki funta bez żadnych dyrektyw preprocesora dołączonych do nich. Przeczytałem podręcznik preprocesora GCC i przewodnik specyfikacji i nie mogę znaleźć nic na ten temat.
(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
W linii 4 po znaku funta nie ma nic. Jaki to ma wpływ? Czy jest to zdefiniowane w specyfikacji preprocesora C (CPP)?
Ponieważ Boost jest biblioteką wieloplatformową, zakładam, że każdy CPP powinien ją poprawnie przeanalizować. Jaki byłby skutek / skutki uboczne losowych znaków funta / krzyżyka w całym kodzie?
c++
c
boost
c-preprocessor
callyalater
źródło
źródło
Odpowiedzi:
Samo A
#
na linii nie ma żadnego efektu. Zakładam, że jest używany ze względów estetycznych.Norma C mówi:
Standard C ++ mówi to samo:
źródło
To sprawia, że kod źródłowy wygląda ładnie, to wszystko.
Podkreśla fakt, że cały blok jest sekcją preprocesora.
I rzeczywiście, zarówno preprocesory C, jak i C ++ muszą ignorować
#
w wierszu.źródło
{
Lub}
w vimie).#
uniemożliwiłoby użycie{
lub}
. W rzeczywistości może być łatwiejsze}
dwukrotne naciśnięcie, aby przeskoczyć blok (w przykładzie PO), niż nie móc przeskoczyć do środka dwóch bloków.Zawsze sprawdzaj wiarygodne źródło zamiast polegać na innych zasobach. C jest znormalizowany jako ISO 9899 :: 2011, C ++ ma również standard ISO. Obie są dobrze przyjęte, a ostateczne wersje robocze są dostępne po krótkim wyszukiwaniu. Standard C stwierdza w 6.10.7 (C ++ ma bardzo podobny tekst):
Jest to dyrektywa zerowa , tak samo jak instrukcja
;
bez poprzedzającego wyrażenia w języku podstawowym jest instrukcją zerową .W przypadku preprocesora służy on tylko do formatowania / czytelności, aby podkreślić, że wiersze należą do siebie semantycznie. (średnik OTOH ma znaczenie semantyczne).
źródło