これについて多くの質問を見てきましたが、特定のコードなしで別の質問をするつもりです。型が不完全な原因を簡単に特定する方法はありますか? 私の場合、私は他の誰かのコードを使用しており、ヘッダーが正しくないことは完全に確信していますが、(コンピューターは人間の眼球よりもはるかに高速で優れているため)コンパイラーに言わせる方法はありますか、「34行目にタイプXがあると思いますが、実際にはありません。」エラー自体は割り当て時にのみ表示されるため、あまり役に立ちません。
7 に答える
先日、誰かが不注意で不完全な型を次のように指定して使用したという質問を見ました。
struct a {
int q;
};
struct A *x;
x->q = 3;
コンパイラは、キーワードのおかげで、完全に未定義であるstruct A
にもかかわらず、それが構造体であることを認識していました。A
struct
それは C++ の場合で、そのような の使用struct
は一般的ではありません (そして、フット シューティングにつながる可能性があります)。あなたがするならCで
typedef struct a {
...
} a;
a
次に、タイプ名として使用し、後で省略できますstruct
。これにより、名前を間違って入力したりヘッダーを忘れたりした場合、コンパイラは後で不完全な型ではなく未定義の識別子エラーを返すようになります。
エラーは割り当て時にのみ表示されるということですか? たとえば、割り当てが見えない GCC では、次のようになります。
int main() {
struct blah *b = 0;
*b; // this is line 6
}
incompletetype.c:6: error: dereferencing pointer to incomplete type
.
エラーは6 行目にあり、不完全な型を完全な型であるかのように使用しています。それまでは元気でした。
間違いは、タイプを定義するヘッダーを含める必要があることです。しかし、コンパイラは、どの行にインクルードする必要があるかをおそらく推測できません。関数の外側にある行であれば、ほとんど問題ありません。また、システム上のすべてのテキスト ファイルを調べて、それを定義するヘッダーを探し、それを含めることを提案することもありません。
または(良い点、ポテトスワッター)、実際に存在するが実際に指定されたタイプを指定するつもりb
だったときに、エラーが定義された行にあります。ほとんどの場合、変数の定義を見つけることはそれほど難しくありません。IDE は通常、それを行うことができます。コンパイラの警告は気にしないかもしれません。ただし、使用しているものの定義が見つからない場合は、かなり凶悪なコードです。blah
b
I don't exactly understand what's the problem. Incomplete type is not the type that's "missing". Incompete type is a type that is declared but not defined (in case of struct types). To find the non-defining declaration is easy. As for the finding the missing definition... the compiler won't help you here, since that is what caused the error in the first place.
A major reason for incomplete type errors in C are typos in type names, which prevent the compiler from matching one name to the other (like in matching the declaration to the definition). But again, the compiler cannot help you here. Compiler don't make guesses about typos.
このエラーは通常、構造体の名前がコード内の構造体の初期化と異なる場合に表示されるため、通常、c は配置した構造体の名前を見つけ、元の構造体が見つからない場合、これは通常表示されます。そのポインターを指すポインターを指すと、エラーが表示されます。