Возможный дубликат:
Is main() really start of a C++ program?Вызов функции перед главным
можно назвать свою функцию перед запуском программы? Как я могу это сделать в C++
или C
?
Возможный дубликат:
Is main() really start of a C++ program?Вызов функции перед главным
можно назвать свою функцию перед запуском программы? Как я могу это сделать в 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()
{
}
Примечание ссылку - Mirror of http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14/proposed alternative - отправленный Лундин.
Примечание: сам класс «class» является поддельным, просто построение глобального (что-то) достаточно. –
Просто будьте в курсе [этой тонкой ошибки] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). Вызов функции не может зависеть от каких-либо статических ресурсов. Вы должны написать его, так как вы будете писать функцию повторного входа. – Lundin
Я считаю, что это технически неверно. AFAIR функция не требуется вызывать до 'main' и может быть отложена до тех пор, пока не понадобится' b'. Или, может быть, просто наблюдаемое состояние должно быть одинаковым. – Pubby
В C++
существует простой способ: использовать конструктор глобального объекта.
class StartUp
{
public:
StartUp()
{ foo(); }
};
StartUp startup; // A global instance
int main()
{
...
}
Это потому, что глобальный объект построен до начала main()
. Как Lundin указал, обратите внимание на static initialization order fiasco.
Любая часть инициализации, действительно, включая аргументы, переданные конструктору. –
Просто имейте в виду [эту тонкую ошибку] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). Вызов функции не может зависеть от каких-либо статических ресурсов. Вы должны написать его, так как вы будете писать функцию повторного входа. – Lundin
В C++ возможно, например.
static int dummy = (some_function(), 0);
int main() {}
В C это недопустимо, поскольку инициализаторы для объектов со статической продолжительностью хранения должны быть постоянными выражениями.
При использовании gcc
и g++
компиляторов, то это можно сделать с помощью __attribute__((constructor))
например ::
В НКУ (с) ::
#include <stdio.h>
void beforeMain (void) __attribute__((constructor));
void beforeMain (void)
{
printf ("\nbefore main\n");
}
int main()
{
printf ("\ninside main \n");
return 0;
}
В г ++ (C++) ::
#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;
}
За исключением этого не является C или C++, это нестандартные расширения GCC. – Lundin
Мне пришлось сначала вызвать функцию void перед основным, и попытался адаптировать этот ответ, но он разбился. Я тестировал cpp.sh, а также шеф-повар кода: тот же результат оба случая. Если я использую printf вместо cout, нет сбоя. Любая идея почему? – StoneThrow
Я предлагаю вам ссылку на эту ссылку ..
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()
Есть ли веские причины вы не можете просто сделать звонок сразу после ввода основных(), но прежде, чем любые из другой вашей коды выполняет? Почему pre-main() требование? – Omaha
Почему бы не вызвать эту функцию при старте? –
Что вы хотите сделать? Если вы еще больше объясните свою фактическую проблему, вы можете получить предложения по дизайну (а не по технике). Хотя вы можете делать то, о чем вы просите, я бы пересмотрел дизайн, который зависит от этого. –