Jaki jest cel pojedynczego znaku krzyżyka / krzyżyka (#) we własnym wierszu w preprocesorze C / C ++?

145

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?

callyalater
źródło
6
@Zaibis Eg. nazwa wykonywalna preprocesora w zestawie GCC to "cpp" (podczas gdy kompilatorami są gcc i g ++)
deviantfan
3
CPP oznacza C-Plus-Plus.
djeidot
6
Nie zupełnie. Zobacz pierwsze zdanie en.wikipedia.org/wiki/C_preprocessor
P45 Imminent
7
@djeidot „cpp” jest niejednoznaczne. Dlatego ludzie używają „c ++” lub „cxx” (x wygląda jak + obrócony o 45 stopni) w odniesieniu do C-Plus-Plus.
Mike Ounsworth,
12
@djeidot Nie, CPP jest C-PreProcesorem. Istniał na długo przed powstaniem C ++.
Leandros

Odpowiedzi:

185

Samo A #na linii nie ma żadnego efektu. Zakładam, że jest używany ze względów estetycznych.

Norma C mówi:

6.10.7 Dyrektywa zerowa

Semantyka

Dyrektywa wstępnego przetwarzania formularza

# new-line

nie ma żadnego efektu.

Standard C ++ mówi to samo:

16.7 Dyrektywa zerowa [cpp.null]

Dyrektywa wstępnego przetwarzania formularza

# new-line

nie ma żadnego efektu.

Jonathan Wakely
źródło
4
Nie wyjaśnia to jednak celu jego używania, ani nie uzasadnia jego istnienia.
StellarVortex
8
"Jaki ma to skutek? Czy jest to zdefiniowane w specyfikacji preprocesora C (CPP)? ... Jaki byłby skutek / skutki uboczne losowych znaków funta / krzyżyka w całym kodzie?" Tak odpowiedziałem. Nie ma to żadnego skutku, ale nie chciałem spekulować na temat powodu, dla którego autor go używa. Zrobiłem to teraz.
Jonathan Wakely
Otrzymałeś poprawne odpowiedzi, że to nic nie znaczy dla preprocesora; Mam zamiar spekulować, że może to pomóc jakiemuś innemu programowi (na przykład IDE lub LINT) w utrzymaniu bloku dyrektyw razem jako jednostki logicznej. Niektóre środowiska IDE pozwalają programistom rozwijać lub zwijać bloki tekstu, aby pomóc im śledzić logiczną strukturę pliku.
Spencer
107

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.

P45 Nieuchronne
źródło
16
Ułatwia także nawigację w niektórych edytorach tekstu (np. {Lub }w vimie).
wchargin
@WChargin, to zależy od tego, jak na to spojrzysz. Jeśli chcesz przejść między dwoma blokami preprocesora, dodanie #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.
Shahbaz,
3
@Shahbaz Z pewnością! Moja praktyczna zasada brzmi: „trzymaj razem jednostki logiczne”, więc „akapit” naprawdę oznacza „pomysł”. Przestrzegałbym tej zasady również w przypadku deklaracji preprocesorów. Oczywiście jest to w dużej mierze kwestia osobistego stylu.
wchargin
46

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

Dyrektywa wstępnego przetwarzania formularza

# new-line

nie ma żadnego efektu.

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

zbyt szczery dla tej strony
źródło