Подскажите разницу между функциями Си: getc и fgetc .
Вот цитата из Кенигана и Ритчи:
getc делает тоже, что и fgetc, но в отличие от последней, если она - макрос, поток может браться более одного раза.Я не понимаю фразы "поток может браться более одного раза".
Это почему я не могу "взять поток" больше одного раза? Что имеется ввиду?
Такой же вопрос можно задать относительно функций putc и fputc.
>getc делает тоже, что и fgetc, но в отличие от последней, если
>она - макрос, поток может браться более одного раза.Следует читать не "поток может браться...", а "параметр stream может вычисляться...". Т.е. getc может быть макросом, и если ты в качестве параметра ей укажешь выражение, то это выражение может быть выполнено заранее неизвестное количество раз.
Например, неизвестно чему будет равна переменная stream после "вызова" getc(stream++).
>Например, неизвестно чему будет равна переменная stream после "вызова" getc(stream++).Лучше такой пример: есть функция get_stream() возвращающаяя поток. Неизвестно, сколько раз она будет вызвана во время getc(get_stream())
>>getc делает тоже, что и fgetc, но в отличие от последней, если
>>она - макрос, поток может браться более одного раза.
>
>Следует читать не "поток может браться...", а "параметр stream может вычисляться...". Т.е.
>getc может быть макросом, и если ты в качестве параметра ей
>укажешь выражение, то это выражение может быть выполнено заранее неизвестное количество
>раз.
>Например, неизвестно чему будет равна переменная stream после "вызова" getc(stream++).То есть, имеются ввиду всего лишь навсего так называемые "побочные эффекты" использования макросов?
Также, получается, что, если "не уверен", то используй fgets? )
>
>То есть, имеются ввиду всего лишь навсего так называемые "побочные эффекты" использования
>макросов?Да.