C中的多个头文件重定义错误

时间:2015-06-12 08:17:36

标签: c header redefinition

包含多个头文件时

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "stackADT.h"
#include "queueADT.h"

发生重新定义错误

In file included from graphTraverse3.c:10:
./queueADT.h:10:16: error: redefinition of 'node'
typedef struct node
               ^
./stackADT.h:9:16: note: previous definition is here
typedef struct node
               ^
In file included from graphTraverse3.c:10:
./queueADT.h:69:20: warning: incompatible pointer types assigning to
      'QUEUE_NODE *' from 'struct node *' [-Wincompatible-pointer-types]
  ...queue->front = queue->front->next;
                  ^ ~~~~~~~~~~~~~~~~~~
./queueADT.h:93:16: warning: incompatible pointer types assigning to
      'QUEUE_NODE *' from 'struct node *' [-Wincompatible-pointer-types]
                queue->front = queue->front->next;
                             ^ ~~~~~~~~~~~~~~~~~~
./queueADT.h:117:23: warning: incompatible pointer types assigning to
      'struct node *' from 'QUEUE_NODE *' [-Wincompatible-pointer-types]
    queue->rear->next = newPtr;
                      ^ ~~~~~~
3 warnings and 1 error generated.

我尝试附上这些,但它没有用。

#ifndef _STACK_H_
#define _STACK_H_
....content....
#endif

也许只适用于C ++。

添加了相关的头文件部分。

First queueADT.h

#ifndef _QUEUE_H_
#define _QUEUE_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


// data type
typedef struct node
  {
    void* dataPtr;
    struct node* next;
  } QUEUE_NODE;

这就是stackADT.h。

#ifndef _STACK_H_
#define _STACK_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Structure Declarations
typedef struct nodeS
  {
  void* dataPtr;
  struct nodeS* link;
  } STACK_NODE;

1 个答案:

答案 0 :(得分:1)

您无法在两个不同的头文件中重新定义相同的符号并将它们包含在一起,您将看到redefinition of 'xxx'错误。

您可以做的是从其中一个文件中删除typedef struct node,或者甚至更好,将您的struct node定义移到另一个文件中,使用{{保护该文件免受多重包含1}}如你所说,并将其包含在&#34; stackADT.h&#34;和&#34; queueADT.h&#34;

例如:

myNode.h:

#ifndef

stackADT.h:

#ifndef MYNODE_H_
# define MYNODE_H_

typedef struct node
{
  char n;
  int  i;
}              QUEUE_NODE;

#endif

queueADT.h:

#include <...>
#include "myNode.h"
#include "..."

这样,您的#include <...> #include "myNode.h" #include "..." 源文件可以保持不变。