Por que todos os arquivos C escritos pelo meu palestrante começam com um único # na primeira linha?

431

Estou examinando algumas anotações do curso C, e cada arquivo fonte do programa C começa com um único #na primeira linha do programa.

Depois, há linhas em branco e outras coisas seguidas pela mainfunção.

Qual é a razão para o #?

(Está fora de prazo agora e não posso realmente perguntar ao sujeito.)

Aqui está um exemplo:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
O Homem Principal
fonte
3
Eu coloquei o primeiro exemplo nas notas do curso. Literalmente, há #uma linha em branco e o programa.
The Main Man
30
O principal objetivo do vazio #é a ofuscação. Se você quiser confundir todos, você pode, por exemplo, iniciar todos os seus arquivos de origem com a linha #//#BEGIN#\\#(que não faz absolutamente nada).
Lundin
3
@Bathsheba Provavelmente é uma dessas pessoas cl.cam.ac.uk/people/academic.html
TylerH 11/17
7
@Bathsheba Os carimbos de hora no último mostram que você deu uma resposta razoavelmente detalhada apenas um minuto após a pergunta ser feita, com uma citação relevante do padrão de referência C99. Você é definitivamente uma pessoa de conspiração. Possivelmente nos Illuminati. Como as duas perguntas acabaram sendo tão populares?
Nat

Respostas:

614

Uau, esta exigência vai caminho de volta à década de 1970.

Nos primórdios do C pré-padronizado, se você desejava chamar o pré - processador , era necessário escrever a #como a primeira coisa na primeira linha de um arquivo de origem. Escrever apenas um #na parte superior do arquivo oferece flexibilidade no posicionamento das outras diretivas do pré-processador.

De um rascunho C original do grande Dennis Ritchie :

12. Linhas de controle do compilador

[...] Para fazer com que o pré-processador seja chamado, é necessário que a primeira linha do programa comece com #. Como as linhas nulas são ignoradas pelo pré-processador, essa linha não precisa conter outras informações.

Esse documento faz uma ótima leitura (e me permitiu pular essa questão como um gato louco).

Suspeito que o palestrante seja simplesmente sentimental - não é exigido desde ANSI C.

Bathsheba
fonte
22
Pelo que entendi, o requisito não é que o primeiro caractere seja um #em uma linha por si só, apenas que comece com um #, então por que não ir diretamente para um #include? Ou estou entendendo errado?
Federico klez Culloca 11/08/19
14
@Bathsheba " Para fazer com que esse pré-processador seja chamado, é necessário que a primeira linha do programa comece com #. Como as linhas nulas são ignoradas pelo pré-processador, essa linha não precisa conter outras informações. " pode já conter uma diretiva de pré-, mas não é necessário ....
5
Não era um requisito quando comecei a programar em C (1980). ANSI C não foi padronizado até 1989.
pojo-guy
29
@ federico-klez-culloca Se se tornar uma inclusão, o arquivo poderá acabar sem um # inicial, porque no futuro alguém excluirá uma inclusão desnecessária sem ter conhecimento dos efeitos colaterais do # inicial.
Fadeway 13/08/19
4
@Casanova - Não. Fazer isso e aceitar essa resposta viola as regras do site. Pedir e responder sob diferentes contas é contrário ao espírito das regras do site, mesmo sem votação mútua, se você entender meu significado. Não há mal nenhum em responder à sua própria pergunta e aceitar a resposta, embora com a mesma conta - já fiz isso no passado.
Bate-Seba
1

Faz nada

A partir do padrão ISO de C / C ++:

Uma diretiva de pré-processamento do formulário

# new-line

não tem efeito.

Portanto, nos compiladores de hoje, esse hash vazio não faz nada (como - new-line ;não tem funcionalidade).


PS : No C pré-padronizado , # new-linetinha um papel importante, era usado para invocar o pré-processador C (como apontado por @Bathsheba). Portanto, o código aqui foi escrito dentro desse período ou veio do hábito.

Minhas Kamal
fonte
-5

Você precisa saber sobre o processo de compilação de C. Como é "preciso saber" como o código-fonte é convertido em código binário executável (arquivo).

No processo de compilação, o código-fonte C deve atravessar a seção do pré-processador. Mas como dizer ao compilador para pré-processar o código? ... Que o símbolo de tempo # foi introduzido no indicador de pré-processamento para o compilador.

Por exemplo #define PI 3.141está no código fonte. Então será alterado após a sessão de pré-processamento. Significa que todo o PI será alterado para 3.141.

Assim #include <stdio.h>, as funções de E / S padrão serão adicionadas ao seu código-fonte.

Se você possui uma máquina Linux, compile como gcc -save-temps source_code.c. E veja as saídas do compilador.

GOBI
fonte