printf определен как void - PullRequest
       9

printf определен как void

0 голосов
/ 18 марта 2012

Я нашел способ заставить замолчать все printf с одновременно, читая C-FAQs .

Не могли бы вы сказать мне, как это работает. Программа:

#include<stdio.h>

//How to silence all printfs at once!!!

#define printf (void) 

#define ab a b c d e f
#define xstr(a) str(a)
#define str(a) #a

#define string "The politicians do not even know the" xstr(ab) "of politics"

main(){

char *all=str(a b c d e f);

printf("%s\n",all);
printf(string);

}

Вывод программы пуст. Я имею в виду, что это вообще ничего не печатает. Если я #define printf как:

/ #define printf  

Это тоже ведет себя так же. Я не понимаю, как GCC компилирует вызовы в двух случаях. Никаких ошибок и предупреждений абсолютно нет.

  • 1-й случай printf становится: (void)("%s\n",all);
  • 2-й регистр printf становится: ("%s\n",all);

Ответы [ 3 ]

3 голосов
/ 18 марта 2012

C имеет оператор запятой , что означает, что оба выражения допустимы.

0 голосов
/ 18 марта 2012

Когда это происходит, оба раза оно компилируется в выражение в скобках, которое просто ничего не делает и возвращает значение своего последнего элемента (разделенного запятыми - это оператор запятой в Си, который иногда можно увидеть в условиях цикла).Даже если вы не преобразуете его в void, настройка по умолчанию в большинстве компиляторов не предупреждает о игнорируемых не пустых возвращаемых значениях, поэтому он хорошо компилируется.

0 голосов
/ 18 марта 2012

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

...