对函数指针进行类型定义似乎只局限于一个 header 文件
Typedeffing a function pointer seems to be local to just one header file
我正在尝试用 C 语言编写网络服务器,并且我有一个名为 route.h
的 header 文件。在 route.h
中,我有行 typedef void (*RouteHandler)(struct HTTPRequest *, struct HTTPResponse *);
,我相信它创建了 typedef RouteHandler
,它是一个 returns 什么都没有的函数,并将两个指向结构的指针作为参数。 route.h
里面还有这个结构:
struct RouteTableEntry {
enum HTTPMethod method;
char *route;
RouteHandler handler;
};
这段代码编译得很好,但是当我尝试在不同的 header、server.h
中使用 typedef 时,我得到编译器错误:server.h:27:8: error: unknown type name ‘RouteHandler’
.
这是我的代码:
route.h
#ifndef ROUTE_H_GUARD_
#define ROUTE_H_GUARD_
#include <stdlib.h>
#include "http.h"
#include "server.h"
typedef void (*RouteHandler)(struct HTTPRequest *, struct HTTPResponse *);
struct RouteTableEntry {
enum HTTPMethod method;
char *route;
RouteHandler handler;
};
...
#endif
server.h
#ifndef SERVER_H_GUARD_
#define SERVER_H_GUARD_
#include <stdint.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include "http.h"
#include "route.h"
...
extern RouteHandler get_handler(enum HTTPMethod method, char *route, RouteHandler handler);
...
#endif
(我已将代码缩减为仅相关部分 - 如果需要全部内容,我将 post 其余部分)
您的 route.h
本身包含 server.h
,并且在 typedef 范围开始之前。正是在处理 that 包含 server.h
时,编译器正确地抱怨范围内没有类型 RouteHandler
的声明。
如果确实 route.h
和 server.h
每个都需要对方声明的东西,那么是时候重构了。你没有提供足够的细节让我们提供具体的建议,但你目前的这种循环依赖会让你继续悲伤。
另一方面,如果 route.h
实际上不需要 server.h
的任何东西,那么它不应该包含它。
我正在尝试用 C 语言编写网络服务器,并且我有一个名为 route.h
的 header 文件。在 route.h
中,我有行 typedef void (*RouteHandler)(struct HTTPRequest *, struct HTTPResponse *);
,我相信它创建了 typedef RouteHandler
,它是一个 returns 什么都没有的函数,并将两个指向结构的指针作为参数。 route.h
里面还有这个结构:
struct RouteTableEntry {
enum HTTPMethod method;
char *route;
RouteHandler handler;
};
这段代码编译得很好,但是当我尝试在不同的 header、server.h
中使用 typedef 时,我得到编译器错误:server.h:27:8: error: unknown type name ‘RouteHandler’
.
这是我的代码:
route.h
#ifndef ROUTE_H_GUARD_
#define ROUTE_H_GUARD_
#include <stdlib.h>
#include "http.h"
#include "server.h"
typedef void (*RouteHandler)(struct HTTPRequest *, struct HTTPResponse *);
struct RouteTableEntry {
enum HTTPMethod method;
char *route;
RouteHandler handler;
};
...
#endif
server.h
#ifndef SERVER_H_GUARD_
#define SERVER_H_GUARD_
#include <stdint.h>
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include "http.h"
#include "route.h"
...
extern RouteHandler get_handler(enum HTTPMethod method, char *route, RouteHandler handler);
...
#endif
(我已将代码缩减为仅相关部分 - 如果需要全部内容,我将 post 其余部分)
您的 route.h
本身包含 server.h
,并且在 typedef 范围开始之前。正是在处理 that 包含 server.h
时,编译器正确地抱怨范围内没有类型 RouteHandler
的声明。
如果确实 route.h
和 server.h
每个都需要对方声明的东西,那么是时候重构了。你没有提供足够的细节让我们提供具体的建议,但你目前的这种循环依赖会让你继续悲伤。
另一方面,如果 route.h
实际上不需要 server.h
的任何东西,那么它不应该包含它。