使用标头时 C 程序无法编译

问题描述 投票:0回答:8

(C 程序)我正在尝试编译一个使用标头的 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);
};

频率.h

#ifndef DEF_FREQUENCE
#define DEF_FREQUENCE

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

#endif

频率.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;
}
c linux gcc header-files
8个回答
5
投票

至少,您需要将

stat_mot
的定义从 frequence.c 移至 frequence.h。
main()
尝试创建它的实例,如果没有结构定义,则无法执行此操作。

还有其他一些问题:

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

3
投票

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


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
strlen
free

frequence.c
中,
strlen
始终大于或等于 0,因此比较始终为 true。


1
投票

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

尝试使用

gcc main.c frequence.c

进行编译

此外,

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


1
投票

您在头文件中声明结构

stat_mot
(前向声明),但您在源文件frequence.c
定义
它。因此它无法从
main.c
使用。


1
投票

只需将结构体声明放入头文件即可:

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

因此两个翻译单元(即

.c
文件)都能看到它。


0
投票

struct stat_mot
需要在头文件中定义或者使用指针。

哦还有(虽然这不是问题)

typedef struct stat_mot;

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

typedef struct stat_mot stat_mot;


0
投票

也许你应该写这个

typedef struct stat_mot stat_mot;

以您的频率。h 然后

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

在.c文件中。

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

提示:不需要 ;在 main(){} 的末尾;

© www.soinside.com 2019 - 2024. All rights reserved.