函数指针typedef可以在C中向前声明吗?

时间:2017-08-25 14:12:29

标签: c function-pointers typedef forward-declaration

标题说明了一切!可以这样做,如果是,怎么做?

如果你必须知道的话,有一些背景知识:我们最近接管了另一个团队的项目(因为他们被解散),这个项目具有强烈相互依赖的标题。如果没有将头文件中的东西从逻辑上属于其他东西,并且在逻辑上不属于其他地方的东西中进行更改,则很难进行更改。

到目前为止,处理此问题的方法是在必要时简单地从其他标头转发声明结构和函数。在我们进入typedef函数指针之前,这一点工作得相当好,这就是我们的回调函数类型当前的实现方式。

我们希望解决这个问题,如果可能的话,不必干扰头文件的逻辑,但是无法将这些typedef转发到远处。各种搜索'转发声明typedef'只产生了关于向前声明typedef结构的结果,这根本没有帮助我们。

示例:

A.H

/* @file a.h */
#ifndef _a_
#define _a_

#include "b.h"

// Definitions that need stuff from b.h

typedef void (some_callback_function) (uint32_t, uint16_t, uint8_t*);

// More definitions that need stuff from b.h
#endif

b.h:

/* @file b.h */
#ifndef _b_
#define _b_

#include "a.h"

// Definitions that need stuff from a.h

struct some_struct {
    // Stuff
    some_callback_function *cb_someting; // ERROR: some_callback_function not defined yet!
    // Other stuff
};

// More definitions that need stuff from a.h
#endif

编辑:在此示例中,包含a.h时出现问题。在宣布包含b.h的任何内容之前,它首先要做的事情是a.h,在宣布任何内容之前还包括a.h。守卫在这里阻止了一个无限循环,但我仍然最终使用b.h尝试使用稍后将在^AT[1-5]G[0-9]{1,5}$ 中声明但尚未声明的内容声明某些内容。因此,前向声明应该为结构和函数提供技巧。

如果无法向前声明typedef,我可以想到两个丑陋的解决方法:

  • 从头文件中删除包含,并将其留给用户以包含其他标头。据我所知,这被认为是错误的编码风格,因为标题应该包含它们的依赖关系。
  • 在#includes之前移动typedef。我不确定这是否真的是糟糕的风格,但我的直觉告诉我,在#includes之前放任何东西都是邪恶的。此外,只有在typedef不需要任何其他头文件的任何内容时,这才有效。

0 个答案:

没有答案