【问题标题】:Call a function before main [duplicate]在main之前调用一个函数[重复]
【发布时间】:2012-06-09 11:38:43
【问题描述】:

可能重复:
Is main() really start of a C++ program?

可以在程序启动之前调用我的函数吗?我如何在C++C 中完成这项工作?

【问题讨论】:

  • 是否有一个令人信服的理由,您不能在进入 main() 之后但在任何其他代码执行之前立即进行调用?为什么 pre-main() 是必需的?
  • 为什么不在main begin调用这个函数?
  • 你想做什么?如果您进一步解释您的实际问题,您可能会得到有关设计(而不是技术)的建议。虽然您可以按照您的要求做,但我会重新考虑基于此的设计。
  • 你得到的答案会做你想做的事,但要注意评估顺序没有明确定义,所以如果你有两个,不知道哪个会先运行,所以做一个取决于结果,其他的就是坏事等着发生。这个错误很常见,它有自己的名字:静态订单初始化惨败。
  • 我正在阅读有关记录器的信息,我认为在程序启动之前知道如何启动方法很有用。

标签: c++ c startup main


【解决方案1】:

您可以拥有一个全局变量或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 - 由 Lundin 发布。

【讨论】:

  • 注意:class 本身在这里是虚假的,只需构建一个全局(随便)就足够了。
  • 请注意this subtle bug。不允许调用的函数依赖于任何静态资源。您应该像编写可重入函数一样编写它。
  • 我认为这在技术上是不正确的。 AFAIR 该函数不需要在main 之前调用,可以延迟到需要b 之前。或者也许只是可观察的状态必须相同。
  • @Pubby 我相信实际上订单是强制执行的,但我不会在标准中寻找报价。 :)
  • 附加警告,如果该代码曾经落在静态 linux 库 (lib*.a) 中:如果没有另行通知,链接器将忽略任何未使用的变量,包括初始化 -> foo() 永远不会调用。
【解决方案2】:

C++中有一个简单的方法:使用全局对象的构造函数

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

StartUp startup; // A global instance

int main()
{
    ...
}

这是因为全局对象是在main() 开始之前构造的。正如Lundin 指出的,请注意static initialization order fiasco

【讨论】:

  • 初始化的任何部分,真的,包括传递给构造函数的参数。
  • 请注意this subtle bug。不允许调用的函数依赖于任何静态资源。您应该像编写可重入函数一样编写它。
【解决方案3】:

如果使用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;
}

【讨论】:

  • 除了这不是 C 也不是 C++,它是 GCC 非标准扩展。
  • 我最近需要在 main 之前调用 void function,并尝试调整此答案,但它崩溃了。我在 cpp.sh 和 code chef 进行了测试:两种情况的结果相同。如果我使用 printf 而不是 cout,则不会发生崩溃。知道为什么吗?
  • @StoneThrow 我怀疑你的函数是在 cout 构造之前调用的。
【解决方案4】:

在 C++ 中是可能的,例如

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

int main() {}

在 C 中这是不允许的,因为具有静态存储持续时间的对象的初始化程序必须是常量表达式。

【讨论】:

  • 在C中有没有办法?仅在 C++ 中?
  • @Nick:是的,据我所知。
  • @CharlesBailey:你也可以让它在 C 中工作:static size_t dummy = sizeof(some_function(), 0);
  • @Nawaz:这行得通吗?我的印象是sizeof 没有评估它的论点。 (ideone.com/dG62n)
  • @Nawaz,static 变量的初始化必须是未计算的常量表达式。这根本不起作用。
【解决方案5】:

我建议你参考这个链接..

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()

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 2017-08-26
    • 1970-01-01
    • 2011-07-10
    • 2011-06-20
    • 2013-05-05
    • 1970-01-01
    • 2012-12-06
    • 2012-02-27
    相关资源
    最近更新 更多