私はちょうど私が本当に紛らわしいと思う C の癖を見つけました。C では、宣言される前に構造体へのポインターを使用することができます。これは非常に便利な機能であり、宣言へのポインターを扱っているだけでは意味がないため、意味があります。ただし、これが (驚くほど) 真実ではない 1 つのまれなケースを見つけましたが、その理由を実際に説明することはできません。私には、言語設計の間違いのように見えます。
次のコードを使用します。
#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が警告するが、他のコンテキストではそれを許可する理由も説明しない限り、「宣言の順序が重要です」という答えは受け入れません。なぜそれが問題になるのでしょうか?