Escriba un código de lenguaje C que imprima GeeksforGeeks sin ninguna función principal. Lógicamente, parece imposible escribir un programa en C sin usar una función main(). Dado que cada programa debe tener una función main() porque: –
- Es un punto de entrada de cada programa C/C++.
- Todas las funciones predefinidas y definidas por el usuario se llaman directa o indirectamente a través de main.
Por lo tanto, usaremos la directiva de preprocesador (un programa que procesa el código fuente antes de la compilación) #define con argumentos para dar la impresión de que el programa se ejecuta sin main. Pero en realidad funciona con una función principal oculta. Veamos cómo el preprocesador hace su trabajo: –
Por lo tanto, se puede resolver de las siguientes maneras: –
- Usando una macro que define main
C
#include<stdio.h> #define fun main int fun(void) { printf("Geeksforgeeks"); return 0; }
Output: Geeksforgeeks
2. Uso del operador de pegado de fichas La solución anterior tiene la palabra ‘principal’ en ella. Si ni siquiera se nos permite escribir main, podemos usar el operador de pegado de tokens (ver esto para más detalles)
C
#include<stdio.h> #define fun m##a##i##n int fun() { printf("Geeksforgeeks"); return 0; }
Output: Geeksforgeeks
3. Uso de macros argumentadas
C
#include<stdio.h> #define begin(m,a,i,n) m##a##i##n #define start begin(m,a,i,n) void start() { printf("Geeksforgeeks"); }
Output: Geeksforgeeks
4. Modificar el punto de entrada durante la compilación
C
#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; }
Output: Geeksforgeeks
Compilación usando el comando: gcc filename.c -nostartfiles (la opción nostartfiles le dice al compilador que evite la vinculación estándar) Explicación: en una compilación normal, el cuerpo de _start() contendrá una llamada de función a main() [este _start() se agregará a cada código durante la compilación normal], por lo que si la definición de main() no está presente, dará como resultado un error como “En la función `_start’: (.text+0x20): referencia indefinida a `main’. En el código anterior, lo que hemos hecho es que hemos definido nuestro propio _start() y definido nuestro propio punto de entrada, es decir, nomain()
Consulte Ejecutar main() en C – detrás de escena para otra solución. Referencias: Macros y Preprocesadores en C
Complejidad de tiempo: O(1)
Espacio Auxiliar : O(1)
Este artículo es una contribución de Abhay Rathi y fue mejorado por Shubham Bansal . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA