Возможный дубликат:
Является ли main() действительно началом программы на С++?
Можно вызвать функцию до запуска программы? Как я могу сделать эту работу в C++
или C
?
Возможный дубликат:
Является ли main() действительно началом программы на С++?
Можно вызвать функцию до запуска программы? Как я могу сделать эту работу в C++
или C
?
У вас может быть глобальная переменная или член класса static
.
1) static
член класса
//BeforeMain.h
class BeforeMain
{
static bool foo;
};
//BeforeMain.cpp
#include "BeforeMain.h"
bool BeforeMain::foo = foo();
2) глобальная переменная
bool b = foo();
int main()
{
}
Обратите внимание на эту ссылку - Зеркало http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14/предлагаемая альтернатива - отправил Лундин.
В C++
существует простой метод: использовать конструктор глобального объекта.
class StartUp
{
public:
StartUp()
{ foo(); }
};
StartUp startup; // A global instance
int main()
{
...
}
Это потому, что глобальный объект создается до начала main()
. Как отметил Лундин, обратите внимание на статичное финализацию порядка инициализации.
Если вы используете компиляторы gcc
и g++
, то это можно сделать, используя __attribute__((constructor))
например:: Галерея В gcc (c)::
#include <stdio.h>
void beforeMain (void) __attribute__((constructor));
void beforeMain (void)
{
printf ("\nbefore main\n");
}
int main ()
{
printf ("\ninside main \n");
return 0;
}
В g++ (С++)::
#include <iostream>
using namespace std;
void beforeMain (void) __attribute__((constructor));
void beforeMain (void)
{
cout<<"\nbefore main\n";
}
int main ()
{
cout<<"\ninside main \n";
return 0;
}
В С++ можно, например,
static int dummy = (some_function(), 0);
int main() {}
В C это недопустимо, поскольку инициализаторы для объектов со статической продолжительностью хранения должны быть постоянными выражениями.
Я предлагаю вам ссылку на эту ссылку..
http://bhushanverma.blogspot.in/2010/09/how-to-call-function-before-main-and.html
Для компилятора GCC для Linux/Solaris:
#include
void my_ctor (void) __attribute__ ((constructor));
void my_dtor (void) __attribute__ ((destructor));
void
my_ctor (void)
{
printf ("hello before main()\n");
}
void
my_dtor (void)
{
printf ("bye after main()\n");
}
int
main (void)
{
printf ("hello\n");
return 0;
}
$gcc main.c
$./a.out
hello before main()
hello
bye after main()