这可能吗?
static bool initialize()
{
TRC_SCOPE_INIT(...);
...
}
static bool initialized = initialize();
简而言之,我需要尽早调用一系列宏(初始化调试消息)(在线程X启动之前,我无法知道线程X何时是启动)。
答案 0 :(得分:6)
当我最初查看这个问题时,它被标记为C和C ++。代码可以是C或C ++,因为bool
是C99和C11中的类型,就像在C ++中一样(几乎;在C中,您需要<stdbool.h>
标头来获取名称{{1} })。
这两个标签的答案是:
在C ++中,是的。
在C中,没有。
他们不是同一种语言。如果你需要演示,这就像任何一个例子一样好。
答案 1 :(得分:4)
如果您正在使用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;
}
答案 2 :(得分:1)
如果您正在初始化的“stuff”定义在与初始化它的函数相同的转换单元中,那么这应该没问题。此外,它必须在呼叫站点上方定义。否则,由于使用了未初始化的值,您将面临未定义的行为风险。
解决此问题的一种方法是使用指针代替。静态初始化的指针被编译到可执行映像中,因此如果由其他转换单元中定义的静态使用它,则不存在未定义行为的风险。在静态初始化函数中,您可以动态分配“stuff”并将指针设置为指向它,以便以后可以访问它。
答案 3 :(得分:1)
(既然你提到了线程,我会假设你有POSIX线程函数可供你使用。)
出于此目的,存在pthread_once
函数。您需要确保initialize
已被调用的任何地方,请写:
pthread_once(&init_once, initialize);
其中init_once
定义为静态存储持续时间,如果需要可能还有外部链接,pthread_once_t init_once
。