对函数指针进行类型定义似乎只局限于一个 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.hserver.h 每个都需要对方声明的东西,那么是时候重构了。你没有提供足够的细节让我们提供具体的建议,但你目前的这种循环依赖会让你继续悲伤。

另一方面,如果 route.h 实际上不需要 server.h 的任何东西,那么它不应该包含它。