Frage

Wenn mein Projekt mit gcc und der -Wall Option kompilieren, erhalte ich eine Warnung über eine Aussage ohne Wirkung in der nicht-existente letzte Zeile meiner Flex-Datei:

Achtung:

gcc -Wall -O0 -ggdb3 -DNOSUDO -DJOBC -DDEBUG -c lex.yy.c
tokenizer.l: In function ‘yylex’:
tokenizer.l:179: warning: statement with no effect

Shell-Befehl:

$ wc -l tokenizer.l
178 tokenizer.l

Der letzte Teil der lex-Datei:

; {
    return SEMI;
}

Wer weiß, warum ich könnte diese Warnung bekommen?

Wenn ich alle #line Richtlinien zu unterdrücken, ist der Fehler:

lex.yy.c: In function ‘yylex’:
lex.yy.c:1021: warning: statement with no effect

, die auf das ECHO bezieht sich in:

case 30:
YY_RULE_SETUP
ECHO;
    YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(inQuote):
case YY_STATE_EOF(inWord):
    yyterminate();
War es hilfreich?

Lösung

In der Regel werden Sie diesen Fehler aus jeder lex Regel erhalten, die eine unbedingte ‚Rückkehr‘ in ihm, weil flex endet Code zu erzeugen, die wie (nach Makroerweiterung) aussieht:

case xxx:
    return SEMI;
    break;

Das Problem ist, dass der ‚Bruch‘ nicht erreichbar ist. Es muss da sein, falls die Regel nicht zurück (so wird der Code nicht für das nächste Token durch, um den Code fallen, sondern stattdessen geht auf das nächste Token zu erkennen.) Flex nicht intelligent genug ist, um tatsächlich zu analysieren Ihr Regelcode und keine Analyse zu bestimmen, fließen, wenn der Bruch nicht mehr benötigt, so dass es dort nur es immer bringt. In der Regel am Ausgang des flex mit -Wall (oder Bison) gibt Ihnen viele Warnungen wie diese ...

Andere Tipps

Ich denke, es fühlt sich an, dass ; eine Aussage ohne Wirkung ist. Versuchen Sie unter Angabe es:

";" {
    return SEMI;
}

Ich lief in das gleiche Problem und sah hinein ein wenig. Es stellte sich heraus, dass einer meiner „#includes“ in der Flex-Quelldatei (die Datei .L) irgendwie indirekt die Standardbibliothek termios.h-Datei enthalten, die ein Makro mit dem Namen „ECHO“ (als „0000010“) definiert. Die Quelldatei von Flex auf der anderen Seite erzeugt will auch einen Makro mit dem Namen „ECHO“ schaffen, gibt es ein „#ifndef ECHO“ davor. Aber natürlich mit termios.h enthalten, dass „ifndef“ das Ergebnis falsch und ECHO wurde nicht wie beabsichtigt definiert. Das führte zu dem Fehler.

Lange Erklärung, kurze Lösung: Ich habe

#ifdef ECHO
#undef ECHO
#endif

unter all meine enthält in meiner .l-Datei, und das war der Trick.

Ich weiß, dass diese Diskussion Thread schon ein bisschen alt, aber es stellte sich erst, wenn ich die Warnung gegoogelt, so noch mein Beitrag für Leute nützlich sein könnten.

Wie die anderen Antworten gesagt, das Problem ist, dass ein ‚Bruch‘ nach einer ‚Rückkehr‘ nicht erreicht werden kann.

Es wird verwendet, möglich zu sein, einen Compiler zu vergewissern, dass es eine Möglichkeit zum ‚Bruch‘ zu erhalten war durch eine bedingte Rückkehr fälschen:

if (1) return SEMI;

Ich habe den Verdacht, dass einige moderne Compiler klug genug sind, um durch diese zu sehen - das ist eigentlich kontraproduktiv von ihnen. „Ja, Sie haben Recht, Herr Compiler, aber ich kann es so STFU nicht vermeiden“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top