Я просто нашел причуду в C, которую я нахожу очень запутанной. В C можно использовать указатель на структуру до ее объявления. Это очень полезная функция, которая имеет смысл, потому что объявление не имеет значения, когда вы просто имеете в виду указатель на него. Я только что нашел один угловой случай, когда это (удивительно) не правда, и я не могу объяснить, почему. Для меня это выглядит ошибкой в дизайне языка.
Возьмите этот код:
#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), а не конкретного примера, который я вставил.
EDIT:
Я не соглашусь, что "запрос объявления важен" в качестве ответа, если вы также не объясните, почему C предупредит об использовании указателя struct в первый раз в списке аргументов функции, но разрешит его в любом другом контексте. Почему это может быть проблемой?