"Расширенное программирование в среде UNIX, 3-е издание", стр. 151:
Разница между
getc
иfgetc
заключается в том, чтоgetc
можно реализовать как макрос, тогда какfgetc
нельзя реализовать как макрос. Это означает три вещи:
- Аргумент
getc
не должен быть выражением с побочными эффектами.- Поскольку
fgetc
гарантированно является функцией, мы можем взять ее адрес. Это позволяет нам передать адресfgetc
в качестве аргумента другой функции.- Вызовы
fgetc
, вероятно, занимают больше времени, чем вызовыgetc
, так как обычно требуется больше времени для вызова функции.
Какое "выражение с побочными эффектами" может возникнуть для сигнатур функций с указателем потока в качестве параметра?
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
getc(foo())
гдеFILE* foo() {/* side effects*/}
.getc(strptr++)
гдеFILE* strptr
.getc(*pstrptr++)
гдеFILE** pstrptr
. и т.д. Очень легко придумать примеры. - person Jim Balter   schedule 17.12.2013