Escreva um código de linguagem C que imprima GeeksforGeeks sem nenhuma função principal.

Logicamente, parece impossível escrever um programa C sem usar uma função main(). Uma vez que todo programa deve ter uma função main() porque: -

  • É um ponto de entrada de todo programa C / C++.
  • Todas as funções predefinidas e definidas pelo usuário são chamadas direta ou indiretamente através do principal.

Portanto, usaremos a diretiva do pré-processador (um programa que processa o código-fonte antes da compilação) #define com argumentos para dar a impressão de que o programa roda sem o main. Mas, na realidade, ele funciona com uma função principal oculta. Vamos ver como o pré-processador está fazendo seu trabalho: -

acima

Portanto, pode ser resolvido das seguintes maneiras: -

  1. Usando uma macro que define o principal




    #include<stdio.h>
    #define fun main
    int fun(void)
    {
        printf("Geeksforgeeks");
        return 0;
    }
    Resultado: Geeksforgeeks
  2. Usando o operador de colagem de token
    A solução acima contém a palavra 'principal'. Se não tivermos permissão para escrever main, podemos usar o operador token-paste (veja isso para obter detalhes)




    #include<stdio.h>
    #define fun m##a##i##n
    int fun()
    {
        printf("Geeksforgeeks");
        return 0;
    }
    Resultado: Geeksforgeeks
  3. Usando Macro Argumentada




    #include<stdio.h>
    #define begin(m,a,i,n) m##a##i##n
    #define start begin(m,a,i,n)
      
    void start() {
       printf("Geeksforgeeks");
    }
    Resultado: Geeksforgeeks
  4. Modifica o ponto de entrada durante a compilação




    #include<stdio.h>
    #include<stdlib.h>
      
    // entry point function
    int nomain(); 
      
    void _start(){
      
        // calling entry point
        nomain(); 
        exit(0);
    }
      
    int nomain()
    {
        puts("Geeksforgeeks");
        return 0;
    }
    Resultado:  
    Geeksforgeeks

    Compilação usando o comando:
    gcc filename.c -nostartfiles
    (a opção nostartfiles diz ao compilador para evitar o link padrão)

    Explicação:
    Na compilação normal, o corpo de _start() conterá uma chamada de função para main() [este _start() será anexado a todos os códigos durante a compilação normal], portanto, se a definição de main() não estiver presente, resultará em erro como “Na função` _start ':
    (.text + 0x20): referência indefinida para `principal'.
    No código acima, o que fizemos foi definir nosso próprio _start() e definir nosso próprio ponto de entrada, ou seja, nomain()

    • Este método é contribuído por Aravind Alapati

    Consulte Executando main() em C - nos bastidores para outra solução.

    Referências:
    macros e pré-processadores em C

    Este artigo foi contribuído por Abhay Rathi e melhorado por Shubham Bansal . Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.

    Quer aprender com os melhores vídeos com curadoria e problemas práticos, confira o C Foundation Course for Basic to Advanced C.



    <button class="vote-this" data-type="like" style="margin-right:0;margin-left:0"> Gostar
    </button>
    Artigos Recomendados
    Página :
    Artigo contribuído por:
    Vote na dificuldade
    Dificuldade atual: Básica
    <button class="btn" data-gfg-action="article-difficulty" data-rating="1">Fácil</button> <button class="btn" data-gfg-action="article-difficulty" data-rating="2">Normal</button> <button class="btn" data-gfg-action="article-difficulty" data-rating="3">Médio</button> <button class="btn" data-gfg-action="article-difficulty" data-rating="4">Duro</button> <button class="btn" data-gfg-action="article-difficulty" data-rating="5">Especialista</button>
    Aprimorado por:
    Tags de artigo: