Возможный дубликат:
Всегда ли выполнение программы начинается с main в C?
я хочу начать выполнение моей программы, которая содержит 2 функции (исключая основную)
void check(void)
void execute(void)
я хочу начать выполнение из check (), возможно ли это в c / c ++?
Вы можете сделать это с помощью простой оболочки:
int main()
{
check();
}
Вы не можете переносить это любым другим способом, так как стандарт явно указывает main
в качестве точки входа в программу.
РЕДАКТИРОВАТЬ для комментария: Никогда не делай этого. В C ++ вы можете злоупотреблять статической инициализацией, чтобы иметь check
звонил раньше main
во время статической инициализации, но вы все равно не можете позвонить main
на законных основаниях от check
, Вы можете просто иметь check
беги первым. Как отмечено в комментарии, это не работает в C, потому что требует постоянных инициализаторов.
// At file scope.
bool abuse_the_language = (check(), true);
int main()
{
// No op if desired.
}
Различные линкеры имеют различные опции для указания точки входа. Например. Microsoft Linker использует / ENTRY: функция:
Параметр / ENTRY определяет функцию точки входа в качестве начальной
адрес для файла .exe или DLL.
GNU’s ld использует -e или ENTRY () в командном файле.
Нужно сказать, что изменение точки входа — очень продвинутая функция, которую вы должны абсолютно понять, как она работает. Например, это может привести к пропуску загрузки инициализации стандартных библиотек.
int main()
{
check();
return 0;
}
призвание check
от main
кажется наиболее логичным решением, но вы все еще можете изучить с помощью /ENTRY
определить другую точку входа для вашего приложения. Увидеть Вот для получения дополнительной информации.
Вы не можете начать с чего-то другого, кроме основного, хотя есть способы немного код выполняется перед основным.
Помещение кода в статический блок инициализации приведет к запуску кода до main; однако, это не будет на 100% управляемым. хотя вы можете быть уверены, что он запускается до main, вы не можете указать порядок, в котором два статических блока инициализации будут выполняться до того, как оба будут выполнены перед main.
Оба компоновщика и загрузчики имеют концепцию main, которая считается общим «понятным» запуском программы на C / C ++; Тем не менее, есть код, который запускается до main
, Этот код отвечает за «настройку среды» программы (такие вещи, как настройка stdin
или же cin
). Поместив код в статический блок инициализации, вы фактически говорите: «Эй, вам нужно сделать это тоже, чтобы иметь правильную среду». Как правило, это должно быть что-то маленькое, что может стоять самостоятельно в порядке выполнения других элементов.
Если вам нужно выполнить две или три вещи по порядку перед main, то превратите их в правильные функции и вызовите их в начале main.
Есть хитрый способ добиться этого, но это не более чем взлом.
Идея состоит в том, чтобы создать статическую библиотеку, содержащую основную функцию, и заставить ее вызывать функцию «проверки».
Линкер будет разрешать символ при связывании с вашей «программой», и ваш «программный» код действительно не будет иметь основного.
Это НЕ рекомендуется, если только у вас нет особых потребностей (например, всплывают всплывающие окна Windows Screensavers, поскольку вспомогательная библиотека, входящая в комплект Windows SDK, имеет основную функцию, которая выполняет определенную инициализацию, например, анализ командной строки).
Может поддерживаться компилятором. Например, gcc, вы можете использовать -nostartfiles и —entry = xxx, чтобы установить точку входа в программу. Точкой входа по умолчанию является _start, которая вызывает функцию main.
Вы можете «перехватить» вызов main, создав объект до запуска main. Конструктор должен выполнить вашу функцию.
#include <iostream>
void foo()
{
// do stuff
std::cout<<"exiting from foo" <<std::endl;
}
struct A
{
A(){ foo(); };
};
static A a;
int main()
{
// something
std::cout<<"starting main()" <<std::endl;
}