bezeichner ist eine undefinierte Warnung für Funktionen, die bereits in #include vorhanden sind

1118
Rogério Dec

Ich habe einen C ++ - Quellcode, der normalerweise in Visual Studio 2017 kompiliert wird, aber seltsamerweise zeigt VS 2017 die Namen einiger Funktionen, die ich erstellt und in einem hinterlassen habe #include, und beschuldigt ihn als undefinierte Kennung.

Nun, wie ist es "undefiniert", wenn die Funktionen vorhanden sind und das Programm ohne Fehler kompiliert ?

bezeichner ist eine undefinierte Warnung für Funktionen, die bereits in #include vorhanden sind

Was vermisse ich?

1
Haben Sie zufällig die Deklaration der Methode nach diesem bestimmten Aufruf angezeigt? Ich gehe davon aus, dass Sie versucht haben, das Projekt zu schließen und wieder zu öffnen. Ramhound vor 5 Jahren 0
@Ramhound Ich frage mich, ob "Funktionen" hier eigentlich Funktionen bedeuten. Vorverarbeitungsmakros können ebenfalls der Fall sein, und diese können den Syntax-Checker leicht verwirren. Tonny vor 5 Jahren 0
@Tonny - Ich würde auch zustimmen. Es ist nicht klar, ob der "Bezeichner" explode "undefined in diesem Fall eine Warnung oder ein Fehler ist. Wenn es sich um einen Syntaxfehler handelt, sollte der Code kompiliert werden. Ohne die gesamte Datei oder die eigentliche Ausgabe der Kompilierung möchte ich nicht Ich glaube nicht, dass wir tatsächlich sagen können, warum dieser Fehler generiert wird.Für diese Fehlermeldung wurde jedoch fast 2 Jahrzehnte verwendet, als ich Visual Studio zum Kompilieren von C ++ - Code verwendet habe. Ich schätze, dass irgendwo eine fehlende Klammer fehlt er kodiert Ramhound vor 5 Jahren 0

2 Antworten auf die Frage

1
Tonny

Die Syntaxprüfung in der IDE ist nicht zu 100% zuverlässig. Sie werden immer besser, aber eine 100% ige Genauigkeit ist nicht erreichbar, insbesondere nicht für Sprachen wie C und C ++, die Makroprozeduren und ähnliches zulassen.

Bestimmte Kombinationen von # include-Elementen, kombiniert mit Namensräumen und Makroerweiterungen können die Syntaxprüfung von auslösen, obwohl der Code tatsächlich korrekt ist.

Ein Fehler (oder nur eine Warnung) irgendwo im Code oder in einem Include kann zu falschen Syntaxwarnungen weiter unten in der Quelldatei führen.

Dies ist nicht nur ein Problem mit Visual Studio. Dies kann in jeder IDE oder in einem Editor geschehen, in dem die Syntax hervorgehoben / überprüft wird. Ich habe es auch in XCode, Eclipse und CodeBlocks gesehen, um nur einige Beispiele zu nennen.

Im Allgemeinen: Wenn Sie auf so etwas stoßen, ist dies in der Regel ein Hinweis darauf, dass der Quellcode, der die Deklaration definiert (das Include, das in Ihrem Fall explode () definiert) möglicherweise unklar, mehrdeutig oder sogar falsch geschrieben ist. Obwohl es für Ihre spezielle Verwendung von explode () in der Quelle kompiliert wird, ist dies möglicherweise nicht für alle möglichen Anwendungsfälle der Fall.

Sie sollten den Code überarbeiten, damit die rote Linie nicht mehr angezeigt wird. Dies wird für einen anderen Programmierer, der später an dem Code arbeiten muss, verwirrend. Und dieser andere Programmierer kann Sie sein, wenn Sie den Code ein paar Monate später erneut besuchen müssen und dies alles vergessen haben.

0
Rogério Dec

Es ist definitiv ein Fehler in VS 2017. Zum Testen habe ich die Include-Funktion entfernt und in den Quelltext eingefügt: Die rote Linie verschwindet. Und das Beeindruckendste: Nach der Reaktivierung der Funktion zum Einschließen und Löschen aus dem Quellcode (dh alles genau wie zuvor), zeigte VS nicht mehr die rote Linie, weder für diese Funktion noch für die anderen Funktionen, die zuvor angezeigt wurden die gleiche rote Linie ...

Und nur aus Neugier, hier ist die Funktion:

vector<string> explode(string linha, string delim) { vector<string> parte; size_t pos = 0,pos2 = 0; do { pos2 = linha.find(delim, pos); parte.push_back(linha.substr(pos, pos2-pos)); pos = pos2+1; } while(pos2 != string::npos); return parte; } 

Ich glaube nicht, dass das Problem mit meinem Code ist ...