5

次のエラーが表示されます。

arthur@arthur-VirtualBox:~/Desktop$ gcc -o hw -ansi hw1.c
hw1.c: In function `main':
hw1.c:27:16: warning: assignment makes pointer from integer without a cast [enabled by default]
hw1.c: At top level:
hw1.c:69:7: error: conflicting types for `randomStr'
hw1.c:27:18: note: previous implicit declaration of `randomStr' was here

このコードのコンパイル中:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
        char *rndStr;
        rndStr = randomStr(FILE_SIZE);
        /* Do stuff */
        return 0;
}

/*Generate a random string*/
char* randomStr(int length)
{
        char *result;
        /*Do stuff*/
        return result;
}

関数の順序を入れ替えると機能するのはなぜですか?

4

5 に答える 5

10

いくつかの例外を除いて、C の識別子は、宣言する前に使用することはできません。

定義外で関数を宣言する方法は次のとおりです。

// Declare randomStr function
char *randomStr(int length);
于 2012-11-08T20:30:37.833 に答える
5

エラーが発生するのは、シンボルは通常、使用後ではなく使用に宣言する必要があるためです。

その特別な例外は関数です。宣言の前にそれらを使用すると、特定の宣言が推論されます。あなたの場合、推論された宣言は最終的な定義と一致しませんでした。

于 2012-11-08T20:29:53.890 に答える
3

C89 以前では、コンパイラは、対応する宣言または定義の前に関数呼び出しintを検出すると、関数が を返したと見なしていました。同様に、型指定子を関数定義から外した場合、返されると想定されていましたint(これが、多くの古い例で のmain() {...}代わりに just のエントリがある理由ですint main(void) {...})。

への呼び出しはrandomStrその宣言/定義の前に発生するため、 とint互換性がないchar *(明示的なキャストなしで一方の値を他方に割り当てることはできません) を返すと想定されるため、エラーが発生します。

C99 以降、暗黙の型指定は許可されなくなりました。

この-ansiオプションによりgcc、C89 としてコンパイルされます。C99 としてコンパイルするには、-std=c99代わりに使用します。

通常、同じファイル内で最初に使用する前に関数定義を配置するため、コードは下から上に読み取ります (main通常、ファイルで定義されている最後の関数です)。そうすれば、宣言と定義をまっすぐに保つことを心配する必要がなくなります。

于 2012-11-08T21:12:05.163 に答える
2

まだ定義されていない関数を使用する関数の前に、関数宣言を配置する必要があります。

例えば:

int doesFileExist(const char* str);

前に行きmain()ます。

これは、C コンパイラがコード全体を実行し、関数を検出するたびに、その関数がまだ定義されているかどうかを確認するためです。その関数が見つからない場合は、エラーが発生します。main()を使用しますdoesFileExist()。これは、コンパイラが を参照するまでに宣言されていませんmain()。これを修正するには、上で述べたように、上部で関数の宣言を行うことができます。これは、関数がまだ入力されていませんが、後で入力されるため、関数が存在するかのように扱い、後で関数を見つけたら後で接続することをコンパイラーに伝えます (つまり、 、main()関数の後のどこか)。

コードの 2 番目のブロックが機能するのは、コンパイラmain()がそこに到達するまでに使用する関数の定義を持っているためです。関数が定義も宣言もされていないため、最初のブロックは機能しません。

于 2012-11-08T20:34:47.737 に答える
1

関数プロトタイプを追加するだけ

#include <stdio.h>
#include <stdlib.h>

char* randomStr(int length);

int main(int argc, char** argv)
{
        char *rndStr;
        rndStr = randomStr(FILE_SIZE);
        /* Do stuff */
        return 0;
}

/*Generate a random string*/
char* randomStr(int length)
{
        char *result;
        /*Do stuff*/
        return result;
}
于 2012-11-08T22:34:01.593 に答える