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