Странное предупреждение компилятора C: предупреждение: ‘struct’ объявлена внутри списка параметров

Я только что нашел причуду в Си, которая меня очень смущает. В Си можно использовать указатель на структуру до того, как она была объявлена. Это очень полезная функция, которая имеет смысл, потому что объявление не имеет значения, когда вы просто имеете дело с указателем на него. Я только что нашел один угловой случай, когда это (на удивление) не соответствует действительности, и я не могу объяснить, почему. Для меня это выглядит как ошибка в дизайне языка.

Возьми этот код:

#include <stdio.h>

#include <stdlib.h>


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

void a2(struct lol* etc) {

}

int main(void) {
        return 0;
}

дает:

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]

Чтобы устранить эту проблему, мы можем просто сделать это:

#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;
}

Необъяснимая проблема теперь исчезла по необъяснимой причине. Почему?

Обратите внимание, что этот вопрос касается поведения языка C (или, возможно, поведения компилятора gcc и clang), а не конкретного примера, который я вставил.

РЕДАКТИРОВАТЬ:

Я не приму «порядок объявления важен» в качестве ответа, если вы не объясните, почему C впервые предупреждает об использовании указателя структуры в списке аргументов функции, но разрешает это в любом другом контексте. Почему это может быть проблемой?

Ответы на вопрос(3)

Ваш ответ на вопрос