Рубрики

Как написать работающий код C без main ()?

Напишите код языка C, который печатает GeeksforGeeks без какой-либо основной функции.

Логически кажется невозможным написать программу на C без использования функции main (). Поскольку каждая программа должна иметь функцию main (), потому что:

  • Это точка входа в каждую программу на C / C ++.
  • Все предопределенные и определяемые пользователем функции вызываются прямо или косвенно через основной.

Поэтому мы будем использовать директиву препроцессора (программа, которая обрабатывает исходный код перед компиляцией) с аргументами #define, чтобы создать впечатление, что программа работает без main. Но на самом деле это работает со скрытой основной функцией. Посмотрим, как препроцессор делает свою работу:

Следовательно, это может быть решено следующими способами:

  1. Использование макроса, который определяет основной

    #include<stdio.h>
    #define fun main

    int fun(void)

    {

        printf("Geeksforgeeks");

        return 0;

    }

    Output: Geeksforgeeks
  2. Использование оператора вставки токенов
    В приведенном выше решении есть слово «основной». Если нам не разрешено даже писать main, мы можем использовать оператор вставки токена (подробности см. В этом )

    #include<stdio.h>
    #define fun m##a##i##n

    int fun()

    {

        printf("Geeksforgeeks");

        return 0;

    }

    Output: Geeksforgeeks
  3. Использование аргументированного макроса

    #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. Изменить точку входа во время компиляции

    #include<stdio.h>
    #include<stdlib.h>

      
    // функция точки входа

    int nomain(); 

      

    void _start(){

      

        // вызываем точку входа

        nomain(); 

        exit(0);

    }

      

    int nomain()

    {

        puts("Geeksforgeeks");

        return 0;

    }

    Output: 
    Geeksforgeeks

    Компиляция с использованием команды:
    gcc filename.c -nostartfiles
    (опция nostartfiles указывает компилятору избегать стандартного связывания)

    Объяснение:
    При обычной компиляции тело _start () будет содержать вызов функции main () [этот _start () будет добавлен к каждому коду во время обычной компиляции], поэтому, если это определение main () не присутствует, это приведет к ошибке, подобной «В функции« _start »:
    (.text + 0x20): неопределенная ссылка на `main '.
    В приведенном выше коде мы сделали то, что мы определили нашу собственную _start () и определили нашу собственную точку входа, т.е. nomain ()

    • Этот метод предоставлен Аравинд Алапати

    Обратитесь к Выполнению main () в C — за сценой для другого решения.

    Ссылки:
    Макросы и препроцессоры в Си

    Эта статья предоставлена Абхай Рати и улучшена Шубхам Бансал . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

    Рекомендуемые посты:

    Как написать работающий код C без main ()?

    0.00 (0%) 0 votes