我在重新定义结构体时遇到了麻烦。为了解释我的问题,我将考虑 4 个文件。
接口.c
#include "Auth.h"
#include "Info.h"
/* some code here */
Run Code Online (Sandbox Code Playgroud)
解析器.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);
Run Code Online (Sandbox Code Playgroud)
身份验证文件
#include "parser.h"
functionX(int a, struct ParsedAuthResponse *response);
/* some code here */
Run Code Online (Sandbox Code Playgroud)
信息.h
#include "parser.h"
functionY(int a, struct ParsedInfoResponse *response);
/* some code here */
Run Code Online (Sandbox Code Playgroud)
当我在 Interface.c 中不包含 Info.h 或 Auth.h 时,没有问题。
您需要添加一个保护以防止 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
Run Code Online (Sandbox Code Playgroud)
因为每次编写指令时#include "Parser.h",Parser.h 的内容都会简单地复制粘贴到包含位置。这意味着您将同时声明两个结构。
使用ifndef可以防止它被多次复制粘贴。