3
typedef enum
{
    HEARTS = 0, 
    SPADES, 
    DIAMONDS, 
    CLUBS
}Suits; //here HEARTS = 0, SPADES = 1, DIAMONDS = 2, and CLUBS = 3  

int main()
{
    Suits hand;
    play(hand);
    return 0;
}

void play(Suits hand)
{
    printf("Testing.\n");
}

これに似たものをコンパイルすると、コンパイラはエラーを表示します: 関数 'play' の暗黙の宣言と警告: 'menu' は、この関数で初期化されていない可能性があります。これらの問題を解決するにはどうすればよいですか?

4

2 に答える 2

4

コンパイラがplayの呼び出しに遭遇したとき、その関数は以下で宣言されているため、まだその関数を認識していません。したがって、警告。メインの前に宣言を移動するだけです

typedef enum{HEARTS = 0, SPADES, DIAMONDS, CLUBS}Suits; //here HEARTS = 0, SPADES = 1, DIAMONDS = 2, and CLUBS = 3  

void play(Suits hand)
{
  printf("Testing.\n");
}

int main()
{
  Suits hand;
  play(hand);
  return 0;
}

2 番目の警告を削除するには、次のように宣言します。

Suits hand;

しかしhandはまだ初期化されていないため、関数playに指定した値が初期化されていないことをコンパイラが警告します。

handの値を設定するだけです:

Suits hand = SPADES;
于 2013-03-17T01:30:53.600 に答える
0

上記で宣言したように、SuitsHEARTS、SPADES、DIAMONDS、CLUBS の 1 つだけを含むことができる型を定義します。handしたがって、型として宣言するとSuit、列挙型で定義した値を取ることができます。

handカードの種類として定義してみてください:

hand = SPADES;

それから play(hand) を呼び出します。

を宣言するのと同じように考えてくださいint

int x;

xは整数型であり、この型によって定義された値を含む必要があります。関数を呼び出す場合

someFunc (x);

初期化しないとx、未定義の動作になります。

編集:また、play関数の定義を上に置きますmain(列挙定義の後)。それか、上記の関数を宣言する必要がありますmain

void play(Suits hand);

そうでなければ、main定義がその後にあるため、「遊び」が何を指すのかわかりません。

于 2013-03-17T01:27:13.400 に答える