How to write a running C code without main()?

Write a C language code that prints GeeksforGeeks without any main function.

Logically it’s seems impossible to write a C program without using a main() function. Since every program must have a main() function because:-

  • It’s an entry point of every C/C++ program.
  • All Predefined and User-defined Functions are called directly or indirectly through the main.

Therefore we will use preprocessor(a program which processes the source code before compilation) directive #define with arguments to give an impression that the program runs without main. But in reality it runs with a hidden main function. Let’s see how the preprocessor doing their job:-



up

Hence it can be solved in following ways:-

  1. Using a macro that defines main
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    #include<stdio.h>
    #define fun main
    int fun(void)
    {
        printf("Geeksforgeeks");
        return 0;
    }

    chevron_right

    
    

    Output: Geeksforgeeks
  2. Using Token-Pasting Operator
    The above solution has word ‘main’ in it. If we are not allowed to even write main, we can use token-pasting operator (see this for details)

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

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

    chevron_right

    
    

    Output: Geeksforgeeks
  3. Using Argumented Macro

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    #include<stdio.h>
    #define begin(m,a,i,n) m##a##i##n
    #define start begin(m,a,i,n)
      
    void start() {
       printf("Geeksforgeeks");
    }

    chevron_right

    
    

    Output: Geeksforgeeks
  4. Modify the entry point during compilation

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    #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;
    }

    chevron_right

    
    

    Output: 
    Geeksforgeeks

    Compilation using command :
    gcc filename.c -nostartfiles
    (nostartfiles option tells the compiler to avoid standard linking)

    Explanation:
    Under normal compilation the body of _start() will contain a function call to main() [ this _start() will be appended to every code during normal compilation], so if that main() definition is not present it will result in error like “In function `_start’:
    (.text+0x20): undefined reference to `main’.
    In the above code what we have done is that we have defined our own _start() and defined our own entry point i.e nomain()

    • This method is contributed by Aravind Alapati

Refer Executing main() in C – behind the scene for another solution.

References:
Macros and Preprocessors in C

This article is contributed by Abhay Rathi and improved by Shubham Bansal. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : ManasChhabra2



Article Tags :
Practice Tags :


5


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.