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.