Напишите код языка C, который печатает GeeksforGeeks без какой-либо основной функции.
Логически кажется невозможным написать программу на C без использования функции main (). Поскольку каждая программа должна иметь функцию main (), потому что:
- Это точка входа в каждую программу на C / C ++.
- Все предопределенные и определяемые пользователем функции вызываются прямо или косвенно через основной.
Поэтому мы будем использовать директиву препроцессора (программа, которая обрабатывает исходный код перед компиляцией) с аргументами #define, чтобы создать впечатление, что программа работает без main. Но на самом деле это работает со скрытой основной функцией. Посмотрим, как препроцессор делает свою работу:
Следовательно, это может быть решено следующими способами:
- Использование макроса, который определяет основной
#include<stdio.h>
#define fun main
int
fun(
void
)
{
printf
(
"Geeksforgeeks"
);
return
0;
}
Output: Geeksforgeeks
- Использование оператора вставки токенов
В приведенном выше решении есть слово «основной». Если нам не разрешено даже писать main, мы можем использовать оператор вставки токена (подробности см. В этом )#include<stdio.h>
#define fun m##a##i##n
int
fun()
{
printf
(
"Geeksforgeeks"
);
return
0;
}
Output: Geeksforgeeks
- Использование аргументированного макроса
#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
- Изменить точку входа во время компиляции
#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 — за сценой для другого решения.
Ссылки:
Макросы и препроцессоры в СиЭта статья предоставлена Абхай Рати и улучшена Шубхам Бансал . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Можно ли писать «void main ()» или «main ()» на C / C ++?
- Разница между int main () и int main (void) в C / C ++?
- Можно ли перегрузить main () в C ++?
- Что main () возвращает в C и C ++?
- Функции, которые выполняются до и после main () в C
- Выполнение main () в C / C ++ — за сценой
- оператор возврата против выхода () в main ()
- Как изменить вывод printf () в main ()?
- Как напечатать «GeeksforGeeks» с пустым main () в C, C ++ и Java?
- Как написать свой собственный заголовочный файл в C?
- Напишите свои собственные memcpy () и memmove ()
- Когда мы должны написать наш собственный конструктор копирования?
- Когда мы должны написать наш собственный оператор присваивания в C ++?
- Напишите программу на C, которая не будет компилироваться в C ++
- Чтение / запись структуры в файл на C
0.00 (0%) 0 votes