Tôi vừa tìm thấy một quirk trong C mà tôi thấy thực sự khó hiểu. Trong C nó có thể sử dụng một con trỏ đến một cấu trúc trước khi nó đã được khai báo. Đây là một tính năng rất hữu ích có ý nghĩa bởi vì tuyên bố là không liên quan khi bạn chỉ xử lý với một con trỏ đến nó. Tôi chỉ tìm thấy một góc trường hợp mà điều này là (đáng ngạc nhiên) không đúng, mặc dù, và tôi không thể thực sự giải thích tại sao. Đối với tôi nó trông giống như một sai lầm trong thiết kế ngôn ngữ.Cảnh báo trình biên dịch kỳ lạ C: cảnh báo: ‘struct’ được khai báo bên trong danh sách tham số
Hãy mã này:
#include <stdio.h>
#include <stdlib.h>
typedef void (*a)(struct lol* etc);
void a2(struct lol* etc) {
}
int main(void) {
return 0;
}
Cung cấp:
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]
Để loại bỏ vấn đề này, chúng tôi chỉ có thể làm điều này:
#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;
}
Vấn đề không thể giải thích bây giờ là đi cho một không thể giải thích lý do. Tại sao?
Lưu ý rằng câu hỏi này là về hành vi của ngôn ngữ C (hoặc có thể là hành vi trình biên dịch của gcc và clang) và không phải ví dụ cụ thể mà tôi đã dán.
EDIT:
tôi sẽ không chấp nhận "trật tự kê khai là rất quan trọng" như một câu trả lời trừ khi bạn cũng giải thích tại sao C sẽ cảnh báo về việc sử dụng một con trỏ struct cho lần đầu tiên trong một danh sách đối số chức năng nhưng cho phép nó trong bất kỳ ngữ cảnh nào khác. Tại sao điều đó có thể là một vấn đề?
Bạn vẫn nên nói rằng cấu trúc tồn tại trước bằng cách sử dụng 'struct lol; ' – Dave
Trước tiên bạn phải thông báo cho trình biên dịch biết loại tồn tại như cấu trúc lol và sau đó bạn có thể sử dụng cấu trúc lo hoặc con trỏ đến cấu trúc trong tuyên bố của một chức năng mới – hetepeperfan
Cũng có vẻ như trình biên dịch giải thích vấn đề chính xác cho bạn: phạm vi. Đọc các cảnh báo! – Dave