В GNU C macro envSet (name), что означает (void) "" name?


я наткнулся на этот синтаксис сегодня и не мог понять, что это значит:

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

может кто - нибудь пролить свет на это?

3 65

3 ответа:

Это похоже на способ статически гарантировать, что name - Это строковый литерал, а не какой-то другой тип.

Если у вас (void)"" "hello"; тогда это допустимое выражение C.

но если вы делаете что-то вроде (void)"" 1; тогда вы получаете синтаксическую ошибку.

два последовательных строковых литерала объединяются. Предположительно он проверяет, является ли name - строковый литерал. Если это не так, компилятор сообщит об ошибке.

(void) cast будет подавлять предупреждения, такие как"заявление без эффекта".

глядя на код, я считаю, что цель-это вызов getenv первый раз, когда он вызывается, кэшировать результат, а затем после этого использовать кэшированный результат без необходимости вызова