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

Jac*_*ack 3 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;                           \
})
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 5

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

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

这有一些优点:

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

(gcc的表达式语句实现反正打破.该static变量不会在多个重复使用CURRENT_DIR的网站在相同的范围内,并且该if测试是倒退,所以buffer永远不会被初始化为一个非空字符串).