在一个GNU CmacrosenvSet(name)中,(void)“”的名字是什么意思?

我今天遇到这种语法,不能解决它的含义:

// Uses the GNU C statement expression extension #define envSet(name) ({ \ static int initialised; \ static bool set; \ (void) "" name; \ if (!initialised || !g_cacheEnv) { \ const char *value = getenv(name); \ set = value != NULL; \ initialised = true; \ } \ set; \ }) 

我无法理解的具体行是:

 (void) "" name; \ 

请问有人可以点亮这个?

它看起来像一种方法来静态确保name是一个string文字,而不是其他types。

如果你(void)"" "hello"; 那么这是一个有效的Cexpression式。

但是,如果你做一些像(void)"" 1; 那么你会得到一个语法错误。

两个连续的string连接在一起。 据推测它是检查name是否是一个string文字。 如果不是,编译器会报错。

(void)强制转换将禁止像“声明无效”的警告。

看代码,我相信目的是让它第一次调用getenv ,caching结果,然后使用caching结果,而不必再调用getenv 。 如果getenv和string一起使用,那么所有后续的调用都会要求相同的环境variables; 如果没有什么可以改变这个环境variables,那么它们会返回相同的结果。 如果代码被赋予了一个指向后来改变的string的指针,caching的结果可能对新string不正确,所以“”技巧的目的是确保不会发生。

因为每个可能被使用的string文字都需要有自己的静态variables,所以指定的代码片段不能被合理地作为一个函数。 另一方面,每个重复所需的代码量似乎有点多。 而且,如果同一variables在代码中的多个地方进行testing,则每个variables都可能以自己的一组variables和环境检查代码结束。

根据函数的使用方式,最终可能比每次调用时需要testing一个环境variables的代码快得多,而且它可以在循环中调用的函数中使用,而无需预先设置(if客户端代码称为“高级设置”function,应该在那里完成名称查找,不需要在循环内检查是否查找完成)。