2012-05-21 63 views
5

这可能吗?可能通过调用函数初始化静态变量

static bool initialize() 
{ 
    TRC_SCOPE_INIT(...); 
    ... 
} 

static bool initialized = initialize(); 

为了使一个很长的故事,总之,我需要调用一系列的宏(初始化调试信息)尽早(线程X开始之前,我没有这样的功能。当线程X启动时)。

+1

你可以在'main()'例程中向'pthread_once(3)'插入一个调用吗? – sarnold

+0

@KingsIndian:'bool'在C99中使用'stdbool.h'头部有效。 – icktoofay

+0

@icktoofay无论如何它没有被指定为c99,因此添加了C++标记。 –

回答

6

当我最初看到这个问题时,它被标记为C和C++。代码可能是C或C++,因为bool是C99和C11中的一种类型,就像它在C++中一样(几乎在C中,您需要使用<stdbool.h>头文件获取名称bool)。

两个标签的答案是:

  • 在C++中,是的。

  • 在C中,没有。

他们是不一样的语言。如果你需要演示,这是一个很好的例子。

+2

该问题最初发布时仅标记为“c”。由于'bool',@ KingsIndian添加了'C++'标记,但是我恢复了该编辑,因为'bool'在C99中是有效的,并且没有从原始文章中指出它与C++相关。 – icktoofay

+0

@icktoofay:感谢您的澄清;我已经稍微调整了我的答案以认识到这些变化。 –

+0

对于那些好奇的人来说,(a)C++ 11允许你使用constexpr,(b)对它的编译器支持令人惊讶的很少 –

1

这应该是正常的,只要您正在初始化的“东西”在与初始化它的函数的调用相同的翻译单元中定义。另外,它必须在呼叫站点上方定义。否则,由于使用未初始化的值,可能会导致未定义的行为。

解决此问题的一种方法是改用指针。静态初始化的指针被编译到可执行映像中,因此如果其他翻译单元中定义的静态函数使用它,则不存在未定义行为的风险。在您的静态初始化函数中,您动态分配“stuff”并将指针设置为指向它,以便稍后可以访问它。

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; 
} 
1

(既然你提到的线程,我会假设你在您的处置有POSIX线程功能。)

功能pthread_once存在这个确切的目的。你需要的地方,以确保initialize已经被调用,写:

pthread_once(&init_once, initialize); 

其中init_once与静态存储时间,如果需要定义,并可能具有外部链接,如pthread_once_t init_once