C макросов, что означает ((void) 0)? - PullRequest
1 голос
/ 11 апреля 2020

Учитывая следующий код, написанный в соответствии со стандартом C99:

#define LOW 1 
#define MEDIUM 2 
#define HIGH 3

#define LOGGING_LEVEL HIGH

#if LOGGING_LEVEL >= MEDIUM
#define LOG_MEDIUM(message) printf(message) 
#else
#define LOG_MEDIUM(message) ((void)0) 
#endif

void load_configuration() { 
//...
LOG_MEDIUM("Configuration loaded\n"); 
}

какова цель ((void)0) Я много искал в Интернете, но ничего не нашел по этому поводу.

Плюс, почему мы не написали ; после использования printf(message)

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

void-cast исправляет предупреждение компилятора. Вот аналогичный тестовый пример:

int main(void)
{
        0; // generates "foo.c:3:2: warning: statement with no effect"
        (void)0;
        return 0;
}

и (используя скрипт для добавления флагов предупреждений g cc) вы видите предупреждение для строки без приведения:

$ gcc-stricter -c foo.c
foo.c: In function ‘main’:
foo.c:3:2: warning: statement with no effect [-Wunused-value]
  0;
  ^

Дополнительные скобки и отсутствие точки с запятой позволяют использовать результат макроса взаимозаменяемо с printf.

0 голосов
/ 11 апреля 2020

Основная идея состоит в том, чтобы исключить все LOG_MEDIUM, если критерии не были выполнены. После компиляции эти вызовы не влияют на функциональность.

...