C:'struct'的重新定义

时间:2017-06-21 10:43:35

标签: c struct

我遇到了struct重新定义struct的问题。 为了解释我的问题,我会考虑4个文件。

  • Interface.c
  • Parser.h
  • Auth.h
  • Info.h

Interface.c

    #include "Auth.h"
    #include "Info.h"

/* some code here */

Parser.h

struct ParsedAuthResponse {
   char *name;
   char *key;
};

struct ParsedInfoResponse {
   char *name;
   char *message;
};
void auth_parser(char* serverResponse,struct ParsedAuthResponse *response_a);
void scrobble_parser(char* serverResponse, int* scrobbleParsedparsedResponse);
void love_unlove_parser(char* serverResponse, int* loveUnloveParsedResponse);
void getInfo_parser(char* serverResponse,struct ParsedInfoResponse *responseP);

Auth.h

#include "parser.h"
functionX(int a, struct ParsedAuthResponse *response);
/* some code here */

Info.h

#include "parser.h"
functionY(int a, struct ParsedInfoResponse *response);
/* some code here */

当我在Interface.c中不包含Info.h或Auth.h时没有问题。

2 个答案:

答案 0 :(得分:3)

您需要添加一个防护Parser.h两次的防护,如下所示:

#ifndef PARSER_H
#define PARSER_H
struct ParsedAuthResponse {
   char *name;
   char *key;
};

struct ParsedInfoResponse {
   char *name;
   char *message;
};
void auth_parser(char* serverResponse,struct ParsedAuthResponse *response_a);
void scrobble_parser(char* serverResponse, int* scrobbleParsedparsedResponse);
void love_unlove_parser(char* serverResponse, int* loveUnloveParsedResponse);
void getInfo_parser(char* serverResponse,struct ParsedInfoResponse *responseP);
#endif

因为每次编写指令#include "Parser.h"时,Parser.h的内容都将简单地复制粘贴到包含位置。这意味着您将两次声明两个结构。

使用ifndef可以防止它被多次复制粘贴。

答案 1 :(得分:1)

这里的问题是在编译期间,interface.c +所有包含的标题组成了一个"翻译单元"。但由于其中两个头文件都包含parser.h,因此看起来好像该头文件中的内容被声明了两次。

为了避免这些问题,你应该总是使用所谓的"标题保护"在你编写的每个头文件中:

#ifndef PARSER_H  // header guard
#define PARSER_H

struct ParsedAuthResponse {
   char *name;
   char *key;
};

struct ParsedInfoResponse {
   char *name;
   char *message;
};

...

#endif // PARSER_H

这确保了每个翻译单元只能看到一次内容。