Seltsame Compiler-Warnung C: Warnung: 'struct' wird in der Parameterliste deklariert

Ich habe gerade eine Eigenheit in C gefunden, die ich wirklich verwirrend finde. In C kann ein Zeiger auf eine Struktur verwendet werden, bevor sie deklariert wurde. Dies ist eine sehr nützliche Funktion, die sinnvoll ist, da die Deklaration irrelevant ist, wenn Sie nur mit einem Zeiger darauf arbeiten. Ich habe gerade einen Eckfall gefunden, in dem dies (überraschenderweise) nicht wahr ist, und ich kann nicht wirklich erklären, warum. Für mich sieht es nach einem Fehler in der Sprachgestaltung aus.

Nimm diesen Code:

#include <stdio.h>

#include <stdlib.h>


typedef void (*a)(struct lol* etc);

void a2(struct lol* etc) {

}

int main(void) {
        return 0;
}

Gibt:

foo.c:6:26: warning: ‘struct lol’ declared inside parameter list [enabled by default]
foo.c:6:26: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
foo.c:8:16: warning: ‘struct lol’ declared inside parameter list [enabled by default]

Um dieses Problem zu beheben, können wir einfach Folgendes tun:

#include <stdio.h>

#include <stdlib.h>

struct lol* wut;

typedef void (*a)(struct lol* etc);

void a2(struct lol* etc) {

}

int main(void) {
        return 0;
}

Das unerklärliche Problem ist aus einem unerklärlichen Grund verschwunden. Warum?

Beachten Sie, dass sich diese Frage auf das Verhalten von Sprache C (oder möglicherweise auf das Compilerverhalten von gcc und clang) bezieht und nicht auf das von mir eingefügte Beispiel.

BEARBEITEN:

Ich akzeptiere "Die Reihenfolge der Deklaration ist wichtig" nicht als Antwort, es sei denn, Sie erklären auch, warum C vor der erstmaligen Verwendung eines Strukturzeigers in einer Funktionsargumentliste warnen würde, dies jedoch in einem anderen Kontext zulassen würde. Warum sollte das möglicherweise ein Problem sein?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage