Qual è lo scopo di un singolo segno cancelletto / cancelletto (#) sulla propria riga nel preprocessore C / C ++?


145

Ho esaminato il codice sorgente delle librerie Boost e ho notato che spesso ci sono singoli segni di cancelletto senza direttive del preprocessore ad essi collegate. Ho letto il manuale del preprocessore GCC e la guida alle specifiche e non riesco a trovare nulla al riguardo.

(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

Sulla linea 4, non c'è nulla dopo il cancelletto. Che effetto ha questo? È definito nella specifica del preprocessore C (CPP)?

Poiché Boost è una libreria multipiattaforma, suppongo che qualsiasi CPP dovrebbe analizzarlo correttamente. Quale sarebbe l'effetto / gli effetti collaterali di avere segni di cancelletto / cancelletto casuali in tutto il codice?


6
@Zaibis Eg. il nome eseguibile del preprocessore nella suite GCC è "cpp" (mentre i compilatori sono gcc e g ++)
deviantfan

3
CPP sta per C-Plus-Plus.
djeidot,

6
Non del tutto. Vedi la prima frase di en.wikipedia.org/wiki/C_preprocessor
P45 imminente,

7
@djeidot "cpp" è ambiguo. Ecco perché le persone usano "c ++" o "cxx" (x sembra + ruotato di 45 gradi) quando si riferiscono a C-Plus-Plus.
Mike Ounsworth,

12
@djeidot No, CPP è il C-PreProcessor. Esisteva molto prima ancora che esistesse C ++.
Leandros,

Risposte:


185

A #da solo su una linea non ha alcun effetto. Presumo che venga utilizzato per valore estetico.

Lo standard C dice:

6.10.7 Direttiva nulla

Semantica

Una direttiva di preelaborazione del modulo

# new-line

non ha alcun effetto.

Lo standard C ++ dice la stessa cosa:

16.7 Direttiva nulla [cpp.null]

Una direttiva di preelaborazione del modulo

# new-line

non ha alcun effetto.


4
Questo non spiega lo scopo del suo utilizzo, tuttavia, né fornisce la logica della sua esistenza.
StellarVortex

8
"Che effetto ha? È definito nella specifica del preprocessore C (CPP)? ... Quale sarebbe l'effetto / effetti collaterali di avere segni di cancelletto / cancelletto casuali in tutto il codice?" Questo è quello che ho risposto. Non ha alcun effetto, ma non volevo speculare sul motivo dell'autore per usarlo. L'ho fatto ora.
Jonathan Wakely,

Vi sono state fornite risposte corrette che non significano nulla per il preprocessore; Ho intenzione di ipotizzare che possa aiutare qualche altro programma (come un IDE o LINT) a mantenere un blocco di direttive insieme come unità logica. Alcuni IDE consentono ai programmatori di espandere o comprimere blocchi di testo per aiutarli a tenere traccia della struttura logica del file.
Spencer,

107

Rende il codice sorgente carino, tutto qui.

Sottolinea il fatto che l'intero blocco è una sezione preprocessore.

E in effetti, entrambi i preprocessori C e C ++ devono ignorare #su una riga.


16
Inoltre semplifica la navigazione in alcuni editor di testo (ad es. {O }in vim).
mercoledì

@WChargin, dipende da come lo guardi. Se si desidera spostarsi tra i due blocchi del preprocessore, l'aggiunta #impedisce di utilizzare {o }. In effetti, potrebbe essere più semplice premere }due volte per saltare sopra il blocco (nell'esempio del PO) piuttosto che non riuscire a saltare al centro dei due blocchi.
Shahbaz,

3
@Shahbaz Certamente! La mia regola empirica è "tenere unita le unità logiche", in modo che "paragrafo" significhi davvero "idea". Seguirei questa regola anche con le dichiarazioni del preprocessore. Certo, è una questione di stile personale in larga misura.
mercoledì

46

Controlla sempre una fonte autorevole invece di fare affidamento su altre risorse. C è standardizzato come ISO 9899 :: 2011, C ++ ha anche uno standard ISO. Entrambi sono ben accetti e le bozze finali sono disponibili con una breve ricerca. Lo standard C afferma in 6.10.7 (C ++ ha più o meno lo stesso testo):

Una direttiva di preelaborazione del modulo

# new-line

non ha alcun effetto.

Questa è una direttiva nulla , così come una ;senza un'espressione precedente nel linguaggio principale è un'istruzione nulla .

Per il preprocessore è solo per formattazione / leggibilità evidenziare che le linee appartengono semanticamente insieme. (il punto e virgola OTOH è semanticamente rilevante).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.