Como escrever um código C em execução sem main()?
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: -
Portanto, pode ser resolvido das seguintes maneiras: -
- Usando uma macro que define o principal
#include<stdio.h>
#define fun main
int
fun(
void
)
{
printf
(
"Geeksforgeeks"
);
return
0;
}
Resultado: Geeksforgeeks
- 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
- 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
- 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 CEste 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 RecomendadosPágina :Artigo contribuído por:Vote na dificuldadeDificuldade 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:
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva