4

CURRENT_DIR我在我的程序中多次调用(见下文)。就像程序运行时可执行文件路径不会改变一样,每次我调用这个函数时都重新定义它是没有意义的。

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

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

见代码:

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

1 回答 1

6

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

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

这有几个优点:

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

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

于 2012-07-14T05:49:57.460 回答