翻译时的函数调用是否有效?

Is function invocation at translation time valid?

我正在尝试实现一个只能调用一次的函数。但是我想保存 if (firstTime) 检查。 我在想的是:

while (1)
{
    foo();
}

foo()
{
    static int test = 1, srand (test);
    test++;
}

但是我在标准中找不到任何关于此的内容。 所以我不确定,这是未定义的。如果不是这样,是否会按预期调用 srand ?如果不是这样,是否(主要问题是)甚至可以像我在这里做的那样在翻译时调用函数调用(更重要的是,表现得好像)?

您的想法可能是,使用函数调用作为静态变量的初始值设定项将仅在程序启动时调用该函数。

不,这在 C 中是不可能的,在该上下文中只允许常量。在 C++ 中,这是可能的,并且编译器应用一些秘密智慧来了解此类初始化的顺序。

作为首次标记的一个选项,您可以使用指向函数的指针,该函数最初设置为第一次函数,这反过来会将指向函数的指针设置为实际函数。有一定程度的间接性,但它消除了条件分支。

这个想法的一个更通用的版本是使用指向函数的指针作为 "state machine",其中每个函数 "advances"(设置)指向下一个状态的指针(下一个函数作为一部分一系列的功能)。这对于事件或中断驱动的代码很方便。我已经将这种方法用于设备驱动程序和嵌入式代码。