Странное предупреждение компилятора 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 впервые предупреждает об использовании указателя структуры в списке аргументов функции, но разрешает это в любом другом контексте. Почему это может быть проблемой?