Почему Emacs показывает эти предупреждения и ошибки?

Я пытаюсь переключиться на Emacs из VIM, но у меня возникают проблемы с получением средств проверки синтаксиса для небольшого проекта на Си. Я пробовал и Flymake, и Flycheck как средства проверки синтаксиса, и оба показывают несуществующую ошибку компилятора. В настоящее время у меня есть 3 файла, poker.ccards.c а также cards.h,

вот покер.с

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

int main()
{

  struct Deck *deck = malloc(sizeof(struct Deck)); 
  struct Hand *hand = malloc(sizeof(struct Hand));
   clear_deck(deck);
  deck = init_deck(deck);
  deck = shuffle(deck);
  int c = deal(deck, hand);
  if(c != 5) {
    printf("error: not enough cards delt");
  } else {
    print_hand(hand);
  }
  return 0;
}

и это cards.h

typedef enum {
  TWO,
  THREE,
  FOUR,
  FIVE,
  SIX,
  SEVEN,
  EIGHT,
  NINE,
  TEN,
  JACK,
  QUEEN,
  KING,
  ACE,
} Rank;


typedef enum {
  SPADES,
  CLUBS,
  HEARTS,
  DIAMONDS,
} Suit;

struct Card {
  Rank rank;
  Suit suit;
  int shuffled;
};

struct Deck {
  struct Card cards[52];
  int shuffled;
};

struct Hand{
  struct Card cards[5];
};

void * shuffle(struct Deck *deck);
void * init_deck(struct Deck *d);
void clear_deck(struct Deck *d);
void print_deck(struct Deck *d);
void print_hand(struct Hand *h);
int deal(struct Deck *deck, struct Hand *hand);

Обе проверки синтаксиса показывают ошибку для строки

  struct Hand *hand = malloc(sizeof(struct Hand));

а также предупреждения для всех других функций. Здесь *Flycheck errors* буфер

    9  37 error           invalid application of ‘sizeof’ to incomplete type ‘struct Hand’... (c/c++-gcc)
   10   4 warning         implicit declaration of function ‘clear_deck’... (c/c++-gcc)
   11   3 warning         implicit declaration of function ‘init_deck’... (c/c++-gcc)
   11   8 warning         assignment makes pointer from integer without a cast... (c/c++-gcc)
   12   3 warning         implicit declaration of function ‘shuffle’... (c/c++-gcc)
   12   8 warning         assignment makes pointer from integer without a cast... (c/c++-gcc)
   13   3 warning         implicit declaration of function ‘deal’... (c/c++-gcc)
   17   5 warning         implicit declaration of function ‘print_hand’... (c/c++-gcc)

Я чувствую, что emacs не запускает процессор C pre перед проверкой синтаксиса. Могу ли я что-то сделать для правильной работы средства проверки синтаксиса?

1 ответ

Помимо прочего, файл заголовка: cards.h должен содержать подсказку "include guard"

#ifndef CARDS_H
#define CARDS_H

typedef enum {
  TWO,
  THREE,
  FOUR,
  FIVE,
  SIX,
  SEVEN,
  EIGHT,
  NINE,
  TEN,
  JACK,
  QUEEN,
  KING,
  ACE,
} Rank;


typedef enum {
  SPADES,
  CLUBS,
  HEARTS,
  DIAMONDS,
} Suit;

struct Card {
  Rank rank;
  Suit suit;
  int shuffled;
};

struct Deck {
  struct Card cards[52];
  int shuffled;
};

struct Hand{
  struct Card cards[5];
};

void * shuffle(struct Deck *deck);
void * init_deck(struct Deck *d);
void clear_deck(struct Deck *d);
void print_deck(struct Deck *d);
void print_hand(struct Hand *h);
int deal(struct Deck *deck, struct Hand *hand);

#endif // CARDS_H

Я скомпилировал файл: poker.c с дополнениями для проверки ошибок.

Со всеми предупреждениями (linux ubuntu 14.04 и gcc -Wall -Wextra -pedantic ...)

это скомпилировано.

Вот код, который я скомпилировал.

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

int main()
{
    struct Deck *deck = malloc(sizeof(struct Deck)); 
    if( NULL == deck )
    { // then malloc failed
        perror( "malloc for deck failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    struct Hand *hand = malloc(sizeof(struct Hand));
    if( NULL == hand )
    { // then, malloc failed
        perror("malloc for hand failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    clear_deck(deck);
    deck = init_deck(deck);
    deck = shuffle(deck);
    int c = deal(deck, hand);

    if(c != 5) 
    {
        printf("error: not enough cards delt\n"); // \n so will immediate be output

    } 

    else 
    {
        print_hand(hand);
    }

    return 0;
} // end function: main
Другие вопросы по тегам