# include <stdio.h>
# define scanf "%s Hello World"
int main (void)
{
printf(scanf, scanf);
getchar();
return 0;
}
В приведенном выше фрагменте кода перед выполнением кода происходит фаза раскрытия макроса. Здесь каждое вхождение 'scanf' заменяется "%s Hello World"
.
Следовательно, printf(scanf,scanf)
превратится в printf(“%s Hello World” , “%s Hello World”)
.
Окончательный результат будет:
%s Hello World Hello World
Теперь в этой программе не было никаких проблем, потому что мы не используйте здесь функцию scanf.
Однако, если мы используем функцию scanf для какой-либо цели
# include <stdio.h>
# define scanf "%s Hello World"
int main(void)
{
int x;
printf(scanf, scanf);
scanf("%d",&x);
getchar();
return 0;
}
Мы обнаруживаем ошибку:
main.c: In function ‘main’:
main.c:2:17: error: called object is not a function or function pointer
# define scanf "%s Hello World"
^
main.c:7:4: note: in expansion of macro ‘scanf’
scanf("%d",&x);
^~~~~
Почему тогда C позволяет нам назвать макросы после библиотечных функций, таких как Scanf?