2012-07-14 198 views
3

我在我的程序中很多次打电话CURRENT_DIR(见下文)。就像程序运行时可执行文件的路径不会改变一样,每当我调用这个函数时都没有意义再次定义它。如何在一个只能定义一次的函数或宏函数中创建一个变量?

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

我目前的解决方案是:将一个静态变量的所有值设置为0,并在if语句测试中检查第一个字符是否为非null,如果为true,则设置它。但它看起来像一个不雅的..也许有一个更好的解决方案..通过使用包括宏的一些模型,我不知道。任何帮助和differents解决方案非常赞赏。我希望你明白这一点。提前致谢。

看到代码:

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

我应该添加“GCC”标签,因为这显然是特定于GCC? (即表达陈述) – Mysticial 2012-07-14 03:51:13

+0

@Mysticial:我的错误。抱歉。编辑。 – Jack 2012-07-14 03:52:09

+0

不需要道歉。更多标签增加了问题的可见性。 – Mysticial 2012-07-14 03:54:02

回答

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; 
} 

这有几个好处:

  • 它更便携。 (当然,MAX_PATHgetcurrentdir会依赖于平台。)
  • 它具有更好的类型安全性。如果字符串的意思是不变的,你不想让客户不小心修改它。

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

相关问题