这可能吗?
static bool initialize()
{
TRC_SCOPE_INIT(...);
...
}
static bool initialized = initialize();
长话短说,我需要尽早调用一系列宏(初始化调试消息)(在线程 X 启动之前,我无法知道线程 X 何时启动)。
这可能吗?
static bool initialize()
{
TRC_SCOPE_INIT(...);
...
}
static bool initialized = initialize();
长话短说,我需要尽早调用一系列宏(初始化调试消息)(在线程 X 启动之前,我无法知道线程 X 何时启动)。
当我最初查看这个问题时,它被标记为 C 和 C++。代码可以是 C 或 C++,因为bool
它是 C99 和 C11 中的一种类型,就像在 C++ 中一样(几乎;在 C 中,您需要<stdbool.h>
标头来获取名称bool
)。
两个标签的答案是:
在 C++ 中,是的。
在 C 中,没有。
它们不是同一种语言。如果您需要演示,这是一个很好的例子。
如果您使用的是 GCC(或 clang),您可以使用__attribute__((constructor))
:
static bool initialized = false;
__attribute__((constructor))
static void initialize(void) {
initialized = true;
// do some other initialization
}
int main(int argc, char **argv) {
// initialize will have been run before main started
return 0;
}
如果您正在初始化的“东西”与初始化它的函数的调用在同一个翻译单元中定义,这应该没问题。此外,它必须在调用站点之上定义。否则,由于使用未初始化的值,您将面临未定义行为的风险。
解决此问题的一种方法是改用指针。静态初始化的指针被编译到可执行映像中,因此如果它被其他翻译单元中定义的静态变量使用,则不会出现未定义行为的风险。在您的静态初始化函数中,您动态分配“东西”并将指针设置为指向它,以便您以后可以访问它。
(由于您提到了线程,我假设您可以使用 POSIX 线程函数。)
该pthread_once
功能的存在正是为了这个目的。任何你需要确定initialize
已经被调用的地方,写下:
pthread_once(&init_once, initialize);
whereinit_once
用静态存储持续时间定义,如果需要,还可以用外部链接定义,如pthread_once_t init_once
.