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?


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.