Всегда ли выполнение программы начинается с main в C? - PullRequest
2 голосов
/ 01 августа 2011

Должно ли выполнение программы начинаться с основного или можно изменить начальный адрес?

#include <stdio.h>

void fun();

#pragma startup fun

int main()
{
    printf("in main");
    return 0;
}

void fun()
{
    printf("in fun");
}

Эта программа печатает in fun до in main.

Ответы [ 3 ]

9 голосов
/ 01 августа 2011

Команда '#pragma' указана в стандарте ANSI, чтобы иметь произвольный эффект, определяемый реализацией.В препроцессоре GNU C «#pragma» сначала пытается запустить игру «жулик»;если это не удается, он пытается запустить игру «взломать»;если это не удается, он пытается запустить GNU Emacs, отображающий Ханойскую башню;если это не удается, он сообщает о фатальной ошибке.В любом случае предварительная обработка не продолжается.

- Ричард М. Столлман, Препроцессор GNU C, версия 1.34

Выполнение программы начинается при запускекод или «время выполнения».Обычно это какая-то программа-ассемблер, называемая _start или что-то подобное, расположенная (на машинах Unix) в файле crt0.o, который поставляется с пакетом компилятора.Он выполняет настройку, необходимую для запуска исполняемого файла C (например, настраивая stdin, stdout и stderr, векторы, используемые atexit() ... для C ++, он также включает инициализацию глобальных объектов, то есть запуск ихконструкторы).Только тогда управляющий переход к main().

Поскольку цитата в начале моего ответа так красноречиво выражает, то, что делает #pragma, полностью зависит от вашего компилятора.Проверьте его документацию.(Я полагаю, что ваш pragma startup - к слову, к которому следует добавить # - сообщает среде выполнения сначала вызвать fun() ...)

1 голос
/ 02 августа 2011

Что касается стандарта ISO C, то точкой входа для программы на C всегда является main (если только не определенная реализацией функция используется для его переопределения) для размещенной реализации . Для «автономной реализации» (обычно встроенной системы, часто без операционной системы) точка входа определяется реализацией.

0 голосов
/ 01 августа 2011
Программы

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

int a;
int b = 10;

int main()
{
    int c = a * b;
    return 0;
}

В приведенном выше примере кода a и b назначаются 0 и 10 соответственно перед выполнением первой строки в main().

Директива #pragma предназначена для определения поведения, определяемого реализацией. Ваш код с #pragma может компилироваться в одном компиляторе, но не может компилироваться в другом.

...