да, можно написать программу без main ().
Но она косвенно использует main ().
следующая программа поможет вам понять ..
#include<stdio.h>
#define decode(s,t,u,m,p,e,d) m##s##u##t
#define begin decode(a,n,i,m,a,r,e)
int begin()
{
printf(” you are inside main() which is hidden“);
}
Оператор ## называется операцией вставки токена или объединения токена.То есть мы можем объединить два или более символов с ним.
Во 2-й строке программы -
определить decode (s, t, u, m, p, e, d) m## s ## u ## t
Что препроцессор делает здесь.Макодекод (s, t, u, m, p, e, d) расширяется как «msut» (оператор ## объединяет m, s, u & t в msut).Логика заключается в том, что когда вы передаете (s, t, u, m, p, e, d) в качестве аргумента, он объединяет 4-й, 1-й, 3-й и 2-й символы (токены)
Теперь посмотрите на третью строкупрограммы -
определение начала декодирования (a, n, i, m, a, r, e)
Здесь препроцессор заменяет макрос «begin» расширением декодирования (a,п, я, м, а, г, д).В соответствии с определением макроса в предыдущей строке аргумент должен быть расширен таким образом, чтобы 4-й, 1-й, 3-й и 2-й символы были объединены.В аргументе (a, n, i, m, a, r, e) 4-й, 1-й, 3-й и 2-й символы - это «m», «a», «i» и «n».
поэтому он заменит begin by main () препроцессором до того, как программа будет передана компилятору.Вот и все ...