用于在任意翻译单元中的 main 之前执行任意代码的 C++ 成语

ein*_*ica 0 c++ idioms static-block

我有一个带有我的main()函数的翻译单元和另一个没有 main 的翻译单元。假设即使我只控制第二个而无法触摸第一个。

现在,由于我不会讨论的原因,我希望能够在运行之前运行一些代码main()。我知道这可以通过使用函数调用初始化全局变量来完成,但我想隐藏这一点 - 尽可能少地使用宏(我敢说不使用宏吗?可能不可能,C++ 中没有适当的静态块)

什么是优雅的,或者我们可以说,不是很丑的做这件事的方式?更清楚地说,我正在寻找可以多次使用此功能的东西,而不仅仅是让它工作一次的东西。我希望它尽可能接近:

// ... at global scope ...
static {
    // my code here
}
Run Code Online (Sandbox Code Playgroud)

PS:这个问题与这个关于初始化静态类成员的问题有关,但不一样。它还希望清楚地反驳这个声明,它不能在 C++ 中完成

注意:是的,我知道静态初始化顺序失败,不需要提醒我……而且我不是要求绕过它的东西。显然,静态运行代码需要一些谨慎。

YSC*_*YSC 5

请享受静态初始化顺序惨败

int f(/* whatever args you want*/)
{
    // code to be ran before main()
    return 42;
}

static int _ignore = f(/*...*/);
Run Code Online (Sandbox Code Playgroud)

请注意,有时可能不会调用代码,如果不在其他任何地方使用(别名“优化”)。其中一种情况是当 TU 被编译成静态库时(然后未使用的变量和代码可能不会被拉入可执行文件)。(E. Maskovsky 的注释)。

  • @ein 一点也不。您可以将所有这些放在一个匿名命名空间内的编译单元中。 (4认同)