C ++全局函数

时间:2010-09-08 06:57:36

标签: c++

我在a .cpp文件void functionA()中声明了一个全局函数。我希望functionA()在启动前完全调用一次(不在main()内)。我意识到的是,如果函数是int functionB(),我可以使用static int A = functionB()来调用它。但是对于void的返回值,我该怎么做?

由于

4 个答案:

答案 0 :(得分:5)

您将其放入全局对象的构造函数中:

void functionA();

namespace {
  struct global_initializer {
    global_initializer() {functionA();}
  } the_global_initializer;
}

请注意,这具有全局初始化的常见缺点:虽然同一翻译单元中的全局变量按其定义的顺序初始化,但是未定义跨翻译单元的全局变量的初始化顺序。

此外,链接器可能会选择消除未引用的对象(the_global_initializer),这会阻止调用functionA()

答案 1 :(得分:3)

static int a = functionA(), 42;

很少有逗号表达式有用的地方,但这可能就是其中之一。

答案 2 :(得分:0)

您可以使用静态结构,它的构造函数将在main之前被调用。

#include <iostream>

void functionA(void)
{
    std::cout << "Hello, ";
}

static struct BeforeMain
{
    BeforeMain(void)
    {
        // stuff in this constructor is executed before "main" function
        functionA();
    }
} g_beforeMain; // shouldn't get used though

int main(void)
{
    std::cout << "world!" << std::endl;
    return 0;
}

这将打印Hello, world!,虽然我是C ++的新手,所以这可能不是最好的方法。

答案 3 :(得分:0)

解决方案1:使该void函数具有返回类型(例如int)并返回虚拟返回值

如果你不能做解决方案1,

解决方案2:编写wrapper函数,如图所示。确保编写代码,以便wrapper只能调用一次(除非可以多次调用)

总结一下! (并广泛记录)。

void fA(){}

int wrapper(){
   // Have checks here to ensure it is not called more than once
   fA(); 
   return 0;
}

// Extensively document such as `'x' is a bogus dummy variable.`
static int x = wrapper();

int main(){
}