这可能吗?可能通过调用函数初始化静态变量
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中,没有。
他们是不一样的语言。如果你需要演示,这是一个很好的例子。
该问题最初发布时仅标记为“c”。由于'bool',@ KingsIndian添加了'C++'标记,但是我恢复了该编辑,因为'bool'在C99中是有效的,并且没有从原始文章中指出它与C++相关。 – icktoofay
@icktoofay:感谢您的澄清;我已经稍微调整了我的答案以认识到这些变化。 –
对于那些好奇的人来说,(a)C++ 11允许你使用constexpr,(b)对它的编译器支持令人惊讶的很少 –
这应该是正常的,只要您正在初始化的“东西”在与初始化它的函数的调用相同的翻译单元中定义。另外,它必须在呼叫站点上方定义。否则,由于使用未初始化的值,可能会导致未定义的行为。
解决此问题的一种方法是改用指针。静态初始化的指针被编译到可执行映像中,因此如果其他翻译单元中定义的静态函数使用它,则不存在未定义行为的风险。在您的静态初始化函数中,您动态分配“stuff”并将指针设置为指向它,以便稍后可以访问它。
如果你使用GCC(或铛),你可以使用__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);
其中init_once
与静态存储时间,如果需要定义,并可能具有外部链接,如pthread_once_t init_once
。
你可以在'main()'例程中向'pthread_once(3)'插入一个调用吗? – sarnold
@KingsIndian:'bool'在C99中使用'stdbool.h'头部有效。 – icktoofay
@icktoofay无论如何它没有被指定为c99,因此添加了C++标记。 –