C程序在使用标头时不编译

时间:2012-10-11 12:15:58

标签: c linux gcc compiler-construction

(C PROGRAM)我正在尝试编译一个使用标题的main.c,但我收到的错误如下。 当我不使用标题(主文件中的所有方法)时,一切正常。

在字符串S中,程序找到所有单词出现并返回最多出现的单词。

我正在使用:gcc main.c

进行编译

谢谢。

错误

In file included from main.c:9:0:
frequence.h:4:16: warning: useless storage class specifier in empty declaration [enabled by default]
main.c: In function ‘main’:
main.c:15:10: error: variable ‘word’ has initializer but incomplete type
main.c:15:10: warning: passing argument 1 of ‘show_all_words’ from incompatible pointer type [enabled by default]
frequence.h:6:17: note: expected ‘char *’ but argument is of type ‘char (*)[34]’
main.c:15:10: error: invalid use of undefined type ‘struct stat_mot’
main.c:15:19: error: storage size of ‘word’ isn’t known

的main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "frequence.h"

#define LONGUEURMAX 4

int main(char *argv[]) {
  char texte[] = ";! one two, tree foor one two !:;";
  struct stat_mot word = show_all_words(&texte);

  printf("%s : %d\n", word.word, word.frequency);

  return (EXIT_SUCCESS);
};

frequence.h

#ifndef DEF_FREQUENCE
#define DEF_FREQUENCE

typedef struct stat_mot;
int count_word(char * , char * );
struct stat_mot show_all_words(char *);

#endif

frequence.c

#include "frequence.h"

typedef struct stat_mot {
    char * word;
    int frequency;
} stat_mot;

int count_word(char * mot, char * text) {
  int n = 0;
  char *p;

  p = strstr(text, mot);  
  while (p != NULL) {
    n++;
    p = strstr(p + 1, mot);
  }  

  return n;
}

stat_mot show_all_words(char * text) {
    char * text_rw = strdup(text);
    char * p = strtok(text_rw, " .,;:-!?");

    char word_to_return[strlen(text)];
    int  word_frequence = 0;

    while (p != NULL) {
      if (strlen(p) >= 0) {
        int offset = p - text;
        int count = count_word(p, text);

        if (word_frequence < count) {
          strcpy(word_to_return, p);          
          word_frequence = count;
        }
      };

      p = strtok(NULL, " .,;:-!?");
    }

    free(text_rw);
    struct stat_mot word = { word_to_return, word_frequence };
    return word;
}

8 个答案:

答案 0 :(得分:4)

至少,您需要将stat_mot的定义从frequence.c移动到frequence.h。 main()尝试创建它的实例,如果没有结构定义,就不能这样做。

还有一些其他问题:

  • 我发现很难相信char*char(*)[34]之间的类型不匹配是通过将所有内容放入一个文件来解决的。所以我希望修补程序与您将代码组织到文件中没有任何关系,只需要传递texte,而不是&texte
  • “空声明中无用的存储类说明符” - 是一个令人困惑的错误消息,但它的出现是因为在C语法中typedef是一个存储类说明符。不要问为什么。基本上,typedef struct stat_mot;是错误的,但是没关系,因为移动结构定义时无论如何都可以删除它。

答案 1 :(得分:3)

您的结构定义必须位于标题中。

答案 2 :(得分:1)

标题仅适用于定义 - 例如编译实际上有效,但链接器不知道在哪里查找函数体。

尝试使用gcc main.c frequence.c

进行编译

此外,typedef struct stat_mot;没有多大意义 - 此时尚未定义struct stat_mot,而且,您没有使用此typedef为其指定新名称。 我认为分离结构定义即使被允许也没有意义 - 毕竟,如果你只是分发头文件,人们应该知道如何使用结构(例如,看看它包含的内容)

答案 3 :(得分:1)

在头文件中声明结构stat_mot(转发声明),但您在源文件frequence.c中定义。因此,main.c无法使用它。

答案 4 :(得分:1)

只需将结构声明放入头文件中:

/* in frequence.h */
struct stat_mot {
    char* word;
    int frequency;
};

所以两个翻译单元(即.c文件)都能看到它。

答案 5 :(得分:1)

您必须将stat_mot结构放入frequence.h

此外,main()应声明为

int main(int argc, char **argv)

texte应该是char *

int main(char *argv[])
{
    char *texte = ";! one two, tree foor one two !:;";
    struct stat_mot word = show_all_words(texte);

由于您使用<string.h><stdlib.h>frequence.c,您还应该在strstr中加入strlenfree

frequence.c中,strlen始终大于或等于零,因此比较将始终为真。

答案 6 :(得分:0)

需要在头文件中定义

struct stat_mot或使用指针。

哦和(虽然这不是问题)

typedef struct stat_mot;

您需要指定第二个类型名称,如下所示:

typedef struct stat_mot stat_mot;

答案 7 :(得分:0)

可能你应该写这个

typedef struct stat_mot stat_mot;

在你的频率 然后

typedef struct stat_mot {
    char * word;
    int frequency;
};
<。>在.c文件中。

.h文件只是数据文件或方法的声明,但您应该清楚地声明它。

提示:没有必要;在main(){};

的末尾