2012-06-05 4 views
30

Возможный дубликат:
Is main() really start of a C++ program?Вызов функции перед главным

можно назвать свою функцию перед запуском программы? Как я могу это сделать в C++ или C?

+16

Есть ли веские причины вы не можете просто сделать звонок сразу после ввода основных(), но прежде, чем любые из другой вашей коды выполняет? Почему pre-main() требование? – Omaha

+3

Почему бы не вызвать эту функцию при старте? –

+3

Что вы хотите сделать? Если вы еще больше объясните свою фактическую проблему, вы можете получить предложения по дизайну (а не по технике). Хотя вы можете делать то, о чем вы просите, я бы пересмотрел дизайн, который зависит от этого. –

ответ

38

У вас может быть глобальная переменная или член класса 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 - отправленный Лундин.

+4

Примечание: сам класс «class» является поддельным, просто построение глобального (что-то) достаточно. –

+3

Просто будьте в курсе [этой тонкой ошибки] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). Вызов функции не может зависеть от каких-либо статических ресурсов. Вы должны написать его, так как вы будете писать функцию повторного входа. – Lundin

+0

Я считаю, что это технически неверно. AFAIR функция не требуется вызывать до 'main' и может быть отложена до тех пор, пока не понадобится' b'. Или, может быть, просто наблюдаемое состояние должно быть одинаковым. – Pubby

25

В C++ существует простой способ: использовать конструктор глобального объекта.

class StartUp 
{ 
public: 
    StartUp() 
    { foo(); } 
}; 

StartUp startup; // A global instance 

int main() 
{ 
    ... 
} 

Это потому, что глобальный объект построен до начала main(). Как Lundin указал, обратите внимание на static initialization order fiasco.

+0

Любая часть инициализации, действительно, включая аргументы, переданные конструктору. –

+4

Просто имейте в виду [эту тонкую ошибку] ​​(http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). Вызов функции не может зависеть от каких-либо статических ресурсов. Вы должны написать его, так как вы будете писать функцию повторного входа. – Lundin

11

В C++ возможно, например.

static int dummy = (some_function(), 0); 

int main() {} 

В C это недопустимо, поскольку инициализаторы для объектов со статической продолжительностью хранения должны быть постоянными выражениями.

+0

В C нет пути? Только в C++? – Nick

+0

@ Ник: да, насколько я знаю. –

+2

@CharlesBailey: Вы можете заставить его работать и на C: 'static size_t dummy = sizeof (some_function(), 0);' – Nawaz

14

При использовании 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; 
} 
+7

За исключением этого не является C или C++, это нестандартные расширения GCC. – Lundin

+0

Мне пришлось сначала вызвать функцию void перед основным, и попытался адаптировать этот ответ, но он разбился. Я тестировал cpp.sh, а также шеф-повар кода: тот же результат оба случая. Если я использую printf вместо cout, нет сбоя. Любая идея почему? – StoneThrow

2

Я предлагаю вам ссылку на эту ссылку ..

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() 
Смежные вопросы