как начать выполнение программы на c / c ++ из другой функции, но не из main ()

Возможный дубликат:
Всегда ли выполнение программы начинается с main в C?

я хочу начать выполнение моей программы, которая содержит 2 функции (исключая основную)

void check(void)
void execute(void)

я хочу начать выполнение из check (), возможно ли это в c / c ++?

0

Решение

Вы можете сделать это с помощью простой оболочки:

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.
}
9

Другие решения

Различные линкеры имеют различные опции для указания точки входа. Например. Microsoft Linker использует / ENTRY: функция:

Параметр / ENTRY определяет функцию точки входа в качестве начальной
адрес для файла .exe или DLL.

GNU’s ld использует -e или ENTRY () в командном файле.

Нужно сказать, что изменение точки входа — очень продвинутая функция, которую вы должны абсолютно понять, как она работает. Например, это может привести к пропуску загрузки инициализации стандартных библиотек.

7

int main()
{
check();
return 0;
}
5

призвание check от main кажется наиболее логичным решением, но вы все еще можете изучить с помощью /ENTRY определить другую точку входа для вашего приложения. Увидеть Вот для получения дополнительной информации.

1

Вы не можете начать с чего-то другого, кроме основного, хотя есть способы немного код выполняется перед основным.

Помещение кода в статический блок инициализации приведет к запуску кода до main; однако, это не будет на 100% управляемым. хотя вы можете быть уверены, что он запускается до main, вы не можете указать порядок, в котором два статических блока инициализации будут выполняться до того, как оба будут выполнены перед main.

Оба компоновщика и загрузчики имеют концепцию main, которая считается общим «понятным» запуском программы на C / C ++; Тем не менее, есть код, который запускается до main, Этот код отвечает за «настройку среды» программы (такие вещи, как настройка stdin или же cin). Поместив код в статический блок инициализации, вы фактически говорите: «Эй, вам нужно сделать это тоже, чтобы иметь правильную среду». Как правило, это должно быть что-то маленькое, что может стоять самостоятельно в порядке выполнения других элементов.

Если вам нужно выполнить две или три вещи по порядку перед main, то превратите их в правильные функции и вызовите их в начале main.

1

Есть хитрый способ добиться этого, но это не более чем взлом.

Идея состоит в том, чтобы создать статическую библиотеку, содержащую основную функцию, и заставить ее вызывать функцию «проверки».
Линкер будет разрешать символ при связывании с вашей «программой», и ваш «программный» код действительно не будет иметь основного.

Это НЕ рекомендуется, если только у вас нет особых потребностей (например, всплывают всплывающие окна Windows Screensavers, поскольку вспомогательная библиотека, входящая в комплект Windows SDK, имеет основную функцию, которая выполняет определенную инициализацию, например, анализ командной строки).

1

Может поддерживаться компилятором. Например, gcc, вы можете использовать -nostartfiles и —entry = xxx, чтобы установить точку входа в программу. Точкой входа по умолчанию является _start, которая вызывает функцию main.

1

Вы можете «перехватить» вызов 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;
}
0
По вопросам рекламы [email protected]