wake-up-neo.com

Compiler-Warnung - Schlagen Sie Klammern um die Zuordnung vor, die als Wahrheitswert verwendet wird

Wenn ich versuche, den folgenden Code zu kompilieren, wird folgende Warnung angezeigt:

warning: suggest parentheses around assignment used as truth value

Warum passiert das? Ich glaube, das ist eine ziemlich verbreitete Redewendung. Ich benutze sogar so etwas früher in meinem Code.

struct PIDList* 
getRecordForPID(struct PIDList* list, pid_t pid) {
    while(list = list->next)
        if (list->pid == pid)
            return list;

    return NULL;
}
42
F. P.

Seien Sie explizit - dann warnt der Compiler nicht, dass Sie möglicherweise einen Fehler gemacht haben.

while ( (list = list->next) != NULL )

oder

while ( (list = list->next) )

Eines Tages wirst du froh sein, dass der Compiler dir gesagt hat, Leute mache mache diesen Fehler;)

64
Erik

Während diese bestimmte Redewendung gebräuchlich ist, verwenden Menschen noch häufiger =, Wenn sie == Meinen. Die Konvention, wenn Sie wirklich das = Meinen, besteht darin, eine zusätzliche Ebene von Klammern zu verwenden:

while ((list = list->next)) { // yes, it's an assignment
53
geekosaur

Es ist nur eine "Sicherheitswarnung". Es ist eine relativ häufige Redewendung, aber auch ein relativ häufiger Fehler, wenn Sie vorhatten, == Darin zu haben. Sie können die Warnung ausblenden, indem Sie weitere Klammern hinzufügen:

while ((list = list->next))
19
Carl Norum