如何在函数或宏函数中创建一个必须只定义一次的变量?

时间:2012-07-14 03:48:04

标签: c optimization gcc static-variables

我在我的程序中多次调用CURRENT_DIR(见下文)。就像程序运行时不可更改的可执行路径一样,每次调用此函数时都无需再次定义它。

所以,我正在寻找一个解决方案,一旦设置了这个值,就不应再设置了。

我当前的解决方案是:创建一个静态变量,将所有值设置为0,并在if语句测试中检查第一个字符是否为非null,如果为true,则设置它。但它看起来像一个不优雅的..也许有一个更好的解决方案..通过使用包括宏的一些模型,我不知道。

参见代码:

#define CURRENT_DIR ({                                          \
  static char buffer[MAX_PATH + 1] = { 0 };         \
      if(buffer[0] != '\0')                     \
    getcurrentdir(buffer, MAX_PATH);            \
      buffer;                           \
})

1 个答案:

答案 0 :(得分:5)

我使用的函数(如果需要,可能是inline d)代替gcc特定的表达式语句:

const char* currentDir(void)
{
    static char buffer[MAX_PATH + 1] = { 0 };
    if (buffer[0] == '\0')
    {
        getcurrentdir(buffer, MAX_PATH);
    }
    return buffer;
}

这有一些优点:

  • 它更便携。 (当然,MAX_PATHgetcurrentdir将取决于平台。)
  • 它具有更好的类型安全性。如果字符串是常量,您不希望允许客户端意外地修改它。

(无论如何,gcc表达式语句实现都被破坏了。static变量不会在同一范围内的多个CURRENT_DIR站点中重用,if测试是向后的,所以永远不会将buffer初始化为非空字符串。)