Multiple of same error while compiling \"error: ex

2019-07-19 18:38发布

问题:

I am trying to program in C.

When I compile with the following arguments....

    gcc -D_BSD_SOURCE -Wall -ansi -pedantic -g tokenizer.c FileOccur.c WordList.c wordstat.c indexer.c -o indexer 

I get this from terminal as a response:

In file included from ../Headers/WordList.h:11,
                 from FileOccur.c:12:
../Headers/FileOccur.h:18: error: expected ‘)’ before ‘*’ token
../Headers/FileOccur.h:20: error: expected ‘)’ before ‘*’ token
In file included from ../Headers/WordList.h:11,
                 from WordList.c:11:
../Headers/FileOccur.h:18: error: expected ‘)’ before ‘*’ token
../Headers/FileOccur.h:20: error: expected ‘)’ before ‘*’ token
WordList.c: In function ‘insert_List’:
WordList.c:155: warning: implicit declaration of function ‘insert_FileOccur’
In file included from ../Headers/WordList.h:11,
                 from wordstat.c:11:
../Headers/FileOccur.h:18: error: expected ‘)’ before ‘*’ token
../Headers/FileOccur.h:20: error: expected ‘)’ before ‘*’ token
In file included from ../Headers/WordList.h:11,
                 from indexer.c:11:
../Headers/FileOccur.h:18: error: expected ‘)’ before ‘*’ token
../Headers/FileOccur.h:20: error: expected ‘)’ before ‘*’ token

Here is my FileOccur.h file:

/*
 * FileOccur.h 
 * Includes list of all functions declared in FileOccur.c so that other source files
 * can use them. Also defines the fields for the structs used for FileOccur.c 
 */
#ifndef FILEOCCUR_H
#define FILEOCCUR_H  

#include "../Headers/WordList.h"
#include <stdio.h> 
#include <stdlib.h> 

 typedef struct FileOccur FileOccur;  


 FileOccur * create_FileOccur(char * fileName); 
 void fprint_FileOccur(FILE * indexFile, FileOccur * currFileOccur); 
 void free_Occur(FileOccur * curr);   
 int insert_FileOccur(word * lCurr,char * fileName); 
 void print_FileOccur(FileOccur * currFileOccur); 
 int sort_TotalOccur(word * lCurr, FileOccur * prevFile, FileOccur * currFile);  

 struct FileOccur{ /* 
                   * the FileOccur struct is used as a node to keep information about how many times an
                   * an item was found in a file, the file's name and the next file that has the same 
                   * item in it, in this case a word 
                   *
                   */ 

    char * fileName; 
    int occur;
    FileOccur * next; 
}; 

#endif 

and here is my WordList.h file:

/*
 * WordList.h 
 * Includes list of all functions declared in WordList.c so that other source files
 * can use them. Also defines the fields for the structs used for WordList.c 
 */
#ifndef WORDLIST_H
#define WORDLIST_H    

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


typedef struct word word;
typedef struct wordList list;  

word * create_Word(char * spell, char * fileName);  
void fprint_List(FILE * indexFile, list * words);
void free_List(list * words); 
int insert_List(char * currString, list * words, char * fileName);  
void print_List(list * words); 

struct word{ /* the word struct used as a node to keep important information about each word including 
              * its occurences in the various files, the next word in the list, and the spelling of the 
              * current word. 
              */
    char * spell;
    struct word * next; 
    FileOccur * totalOccur; 
};


struct wordList{ /* my linked list that simply has a pointer to the first node*/ 
    word * start;

}; 


#endif

Please let me know if you need any more information, thank you!

回答1:

Your header files include each other in circular fashion. This is the reason for your error.

Never attempt circular inclusion. It achieves nothing and can only lead to errors. Redesign your headers into a "stratified" hierarchy: higher-level headers include lower-level headers, but not the other way around.

In your case the circular inclusion can be eliminated in one of two ways:

  1. Stop including WordList.h into FileOccur.h. Instead provide forward declaration

    typedef struct word word;
    

    in FileOccur.h.

  2. Stop including FileOccur.h into WordList.h. Instead provide forward declaration

    typedef struct FileOccur FileOccur; 
    

    in WordList.h.

Which approach is better depends on which header file you consider to be a higher-level one.

Also, see here Avoiding Circular Dependencies of header files