43

重複の可能性:
main()は本当にC ++プログラムの開始ですか?

プログラムの起動前に関数を呼び出すことはできますか?またはでこれを行うにはどうすればよいですC++C

4

5 に答える 5

49

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のミラー/提案された代替案-Lundinによって投稿されました。

于 2012-06-05T12:46:47.973 に答える
34

C++簡単な方法があります:グローバルオブジェクトのコンストラクターを使用します。

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

StartUp startup; // A global instance

int main()
{
    ...
}

これは、グローバルオブジェクトがmain()開始前に構築されるためです。Lundinが指摘したように、静的初期化順序の大失敗に注意してください

于 2012-06-05T12:46:53.210 に答える
21

gccg++コンパイラを使用している場合、これはを使用して行うことができます__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 ++(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;
}
于 2012-06-05T13:10:10.353 に答える
18

C ++では、たとえば

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

int main() {}

Cでは、静的ストレージ期間を持つオブジェクトの初期化子は定数式でなければならないため、これは許可されていません。

于 2012-06-05T12:54:50.513 に答える
2

このリンクを参照することをお勧めします。

http://bhushanverma.blogspot.in/2010/09/how-to-call-function-before-main-and.html

Linux / Solaris上のGCCコンパイラの場合:

#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()
于 2012-06-05T13:17:11.713 に答える