可以通过调用函数初始化静态变量

时间:2012-05-21 01:27:04

标签: c

这可能吗?

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

static bool initialized = initialize();

简而言之,我需要尽早调用一系列宏(初始化调试消息)(在线程X启动之前,我无法知道线程X何时是启动)。

4 个答案:

答案 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