我遇到了struct重新定义struct的问题。 为了解释我的问题,我会考虑4个文件。
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时没有问题。
答案 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
这确保了每个翻译单元只能看到一次内容。