Qual é o objetivo de um único sinal de libra / hash (#) em sua própria linha no pré-processador C / C ++?


145

Estive observando o código-fonte das bibliotecas Boost e notei que muitas vezes existem sinais de libra única sem nenhuma diretiva de pré-processador anexada a elas. Li o manual do pré-processador do GCC e o guia de especificações e não consigo encontrar nada sobre isso.

(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

Na linha 4, não há nada após o sinal de libra. Que efeito isso tem? É definido na especificação do pré-processador C (CPP)?

Como o Boost é uma biblioteca de plataforma cruzada, eu assumiria que qualquer CPP deve analisá-lo corretamente. Qual seria o efeito / efeitos colaterais de ter sinais aleatórios de libra / hash em todo o código?


6
@Zaibis Eg. o nome do executável do pré-processador no pacote GCC é "cpp" (enquanto os compiladores são gcc e g ++)
deviantfan

3
CPP significa C-Plus-Plus.
Djidot

6
Não inteiramente. Veja a primeira frase de en.wikipedia.org/wiki/C_preprocessor
P45 iminente

7
@djeidot "cpp" é ambíguo. É por isso que as pessoas usam "c ++" ou "cxx" (x se parece com + virou 45 graus) quando se refere ao C-Plus-Plus.
Mike Ounsworth 5/02

12
@djeidot Não, o CPP é o C-PreProcessor. Existia muito antes de C ++ existir.
Leandros

Respostas:


185

A #por si só em uma linha não tem efeito algum. Presumo que esteja sendo usado para valor estético.

O padrão C diz:

6.10.7 Diretiva nula

Semântica

Uma diretiva de pré-processamento do formulário

# new-line

não tem efeito.

O padrão C ++ diz a mesma coisa:

16.7 Diretiva nula [cpp.null]

Uma diretiva de pré-processamento do formulário

# new-line

não tem efeito.


4
Porém, isso não explica o propósito de usá-lo, nem fornece a justificativa para sua existência.
StellarVortex

8
"Que efeito isso tem? Está definido na especificação do pré-processador C (CPP)? ... Qual seria o efeito / efeitos colaterais de ter sinais aleatórios de libra / hash em todo o código?" Foi o que eu respondi. Não tem efeito, mas não queria especular sobre o motivo do autor para usá-lo. Eu fiz isso agora.
Jonathan Wakely 9/16

Você recebeu respostas corretas de que isso não significa nada para o pré-processador; Vou especular que isso pode ajudar algum outro programa (como um IDE ou LINT) a manter um bloco de diretivas juntos como uma unidade lógica. Alguns IDEs permitem que os programadores expandam ou reduzam blocos de texto para ajudá-los a acompanhar a estrutura lógica do arquivo.
Spencer

107

Faz o código fonte parecer bonito, só isso.

Destaca o fato de que todo o bloco é uma seção de pré-processador.

E, de fato, os pré-processadores C e C ++ devem ignorar #em uma linha.


16
E também facilita a navegação em alguns editores de texto (por exemplo, {ou }no vim).
wchargin

@WChargin, isso depende de como você olha para ele. Se você deseja navegar entre os dois blocos do pré-processador, a adição #impediria o uso de {ou }. De fato, pode ser mais fácil pressionar }duas vezes para pular o bloco (no exemplo do OP) do que não ser capaz de pular para o meio dos dois blocos.
Shahbaz 07/02

3
@Shahbaz Certamente! Minha regra geral é "manter as unidades lógicas unidas", de modo que "parágrafo" realmente signifique "idéia". Eu seguiria essa regra também com declarações de pré-processador. Obviamente, é uma questão de estilo pessoal, em grande medida.
wchargin

46

Sempre verifique uma fonte autorizada em vez de confiar em outros recursos. C é padronizado como ISO 9899 :: 2011, C ++ também possui um padrão ISO. Ambos são bem aceitos e os rascunhos finais estão disponíveis em uma breve pesquisa. O padrão C declara em 6.10.7 (C ++ possui praticamente o mesmo texto):

Uma diretiva de pré-processamento do formulário

# new-line

não tem efeito.

Esta é uma diretiva nula , tanto quanto uma ;expressão sem precedentes no idioma principal é uma declaração nula. .

Para o pré-processador, é apenas para formatação / legibilidade destacar que as linhas pertencem semanticamente. (o ponto e vírgula OTOH é semanticamente relevante).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.