2016-04-21 3 views
1

Я хочу манипулировать выходом lex. В макросе ECHO есть только одна запись в yyout. Макрос окружен «#ifndef ECHO», поэтому я заменяю его желаемым действием. Однако я хочу быть уверенным, чтобы правильно воспроизвести исходное поведение lex. Lex определяет ECHO для этого фрагмента кода:Может ли кто-нибудь объяснить этот выход препроцессора lex?

do { 
    if (fwrite(yytext, yyleng, 1, yyout)) { 
     } 
    } while (0) 

Может кто-нибудь угадать, почему выход не просто "FWRITE (...)"?

+1

См. [Этот вопрос] (http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for) – sjsam

ответ

1
do { .. } while (0) 

удобный способ #define работу с несколькими операторами, как указывал this.

По

if (fwrite(yytext, yyleng, 1, yyout)) 

Я считаю, что вы дали возможность иметь дело с fwrite неудачи.

Здесь вы звоните, fwrite с только 1 элемент размера yyleng. Учитывая, что fwrite возвращает общее количество записанных элементов, возможные возвращаемые значения равны 0 и 1 - 0, указывающие на любой сбой, и 1 указывает на успех.

В идеале (или на самом деле это?), Это должно было быть

if (!fwrite(yytext, yyleng, 1, yyout)) 

Я предполагаю, что это потому, что только блок дается, чтобы написать код запасной вариант/протоколирования.

+0

Это объясняет цикл do - thx для ссылки. Но это не объясняет пустой оператор if. Фрагмент кода - это код целиком - никаких исключений. –

+1

@RobertREvans: Кстати, вы скомпилировали lex из источника? Для этого стоит проверить его документацию. :) – sjsam

Смежные вопросы