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

时间:2015-02-12 13:04:43

标签: c c99

我试图让一个函数只被调用一次。但我想保存if (firstTime)支票。 我在想的是:

while (1)
{
    foo();
}

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

但我在标准中找不到任何涉及此内容的内容。 所以我不确定,这是未定义的。如果不是这样,将按预期调用srand?如果不是这样的话,那么(作为主要问题)是否可以在翻译时调用功能调用(更像是,表现得好像),就像我在这里一样?

2 个答案:

答案 0 :(得分:3)

作为第一个时间标志的选项,您可以使用指向最初设置为第一个时间函数的函数的指针,该指针又将指针设置为实际函数的函数。有一个间接级别,但它消除了一个条件分支。

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

答案 1 :(得分:2)

您的想法可能是使用函数调用作为静态变量的初始化程序,只会在程序启动时调用该函数。

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