C 如何在只能定义一次的函数或宏函数中创建变量?

C 如何在只能定义一次的函数或宏函数中创建变量?,c,optimization,gcc,static-variables,C,Optimization,Gcc,Static Variables,我在程序中多次调用CURRENT\u DIR(见下文)。就像可执行路径在程序运行时不会更改一样,每次调用此函数时再次定义它是没有意义的 所以,我正在寻找一个解决方案,一旦这个值设置好了,就不应该再设置了 我当前的解决方案是:创建一个静态变量,将所有值设置为0,并在if语句测试中检查第一个字符是否为非null,如果为true,则设置它。但它看起来像一个不雅的。。也许有更好的解决办法。。通过使用一些模型,包括宏,我不知道 参见代码: #define CURRENT_DIR ({

我在程序中多次调用
CURRENT\u DIR
(见下文)。就像可执行路径在程序运行时不会更改一样,每次调用此函数时再次定义它是没有意义的

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

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

参见代码:

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

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

这有几个优点:

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

(gcc表达式语句实现无论如何都会被破坏。
静态
变量不会在同一范围内的多个
当前_DIR
站点之间重用,如果
测试是向后的,那么
缓冲区
将永远不会初始化为非空字符串。)

我应该添加“gcc”吗标记,因为这显然是特定于GCC的?(即表达声明)@神秘:我的错误。很抱歉编辑,不用道歉。更多的标签可以增加问题的可见性。
const char* currentDir(void)
{
    static char buffer[MAX_PATH + 1] = { 0 };
    if (buffer[0] == '\0')
    {
        getcurrentdir(buffer, MAX_PATH);
    }
    return buffer;
}