2017-01-12 25 views
3

私のコードはなぜ機能するのですか?私はそれを宣言する前にgenerateNumber関数を呼び出していますが、ファイルの先頭にプロトタイプを設定していないので、通常は動作しません。事前によるCの関数の順序

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


int main(int argc, const char * argv[]) { 
    int max = 100; 
    int min = 1; 
    int mysteryNumber = generateNumber(min, max); 
    int enteredNumber = min-1; 
    do{ 
     printf("Enter a number !\n"); 
     scanf("%d", &enteredNumber); 
     if (enteredNumber > mysteryNumber) { 
      printf("It's less !"); 
     }else if(enteredNumber < mysteryNumber){ 
      printf("It's more !"); 
     } 
    }while (enteredNumber != mysteryNumber); 
    printf("Congratulations, the mystery number was %d \n", mysteryNumber); 
    return 0; 
} 

int generateNumber(int min, int max){ 
    srand(time(NULL)); 
    return (rand() % (max - min + 1)) + min; 
} 

ありがとう:

は、ここに私のコードです!

+0

http://stackoverflow.com/questions/8440816/warning-implicit-declaration-of-function – sabbahillel

+0

"仕事"はどういう意味ですか?それは、プログラムがあなたが期待したことをしなかったように聞こえます。それはうまくいかないようです。 –

+0

私はあなたのプログラムが無効であると言ったあなたのコンパイラの分かりにくいメッセージを無視したと思う。 – AnT

答えて

5

驚いたことに、これは実際にの場合は、は古いコンパイラ、具体的にはC99より前のコンパイラで動作するはずです。コードを壊れやすくするため、暗黙のintがC99で削除されました。

関数にプロトタイプがない場合、古いCコンパイラはすべての引数が渡される式の型と一致すると仮定し、その戻り値の型はintです。あなたの関数は、この記述に似ています.2つの整数を渡し、戻り値をintとして扱います。

1

あなたは正しく動作しないはずです。私はgcc(6.1.0)が生成します。

test.c: In function ‘main’: 
test.c:9:25: warning: implicit declaration of function ‘generateNumber’ [-Wimplicit-function-declaration] 
    int mysteryNumber = generateNumber(min, max); 
         ^~~~~~~~~~~~~~ 

ほとんどのコンパイラは、暗黙の関数宣言を提供することによって、これを許容しているので、それが「作品」。ただし、現代のCでは有効ではありません。

C99がこの暗黙的な関数宣言を標準から削除する前は、許可されました。しかしそれはC99以来もう有効ではありません。 コンパイラに警告が表示されない場合は、警告レベルを上げてみてください。

+0

http://stackoverflow.com/questions/8440816/warning-implicit-declaration-of-functionこれは警告のみなので、コンパイルされます。 – sabbahillel

+1

@sabbahillel C標準は、警告とエラーを区別せず、診断のみを区別します。したがって、(場合によっては未定義の動作などの)警告を伴うコンパイルは、必ずしも*有効な*(C標準に従って)という意味ではありません。 – usr