5

这可能吗?

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

static bool initialized = initialize();

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

4

4 回答 4

6

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

两个标签的答案是:

  • 在 C++ 中,是的。

  • 在 C 中,没有。

它们不是同一种语言。如果您需要演示,这是一个很好的例子。

于 2012-05-21T01:39:02.080 回答
6

如果您使用的是 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;
}
于 2012-05-21T01:50:31.977 回答
1

如果您正在初始化的“东西”与初始化它的函数的调用在同一个翻译单元中定义,这应该没问题。此外,它必须在调用站点之上定义。否则,由于使用未初始化的值,您将面临未定义行为的风险。

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

于 2012-05-21T01:42:36.943 回答
1

(由于您提到了线程,我假设您可以使用 POSIX 线程函数。)

pthread_once功能的存在正是为了这个目的。任何你需要确定initialize已经被调用的地方,写下:

pthread_once(&init_once, initialize);

whereinit_once用静态存储持续时间定义,如果需要,还可以用外部链接定义,如pthread_once_t init_once.

于 2012-05-21T03:44:16.760 回答