如何在 header 文件中声明具有未知参数数据类型的函数?

How to declare a function with an unknown parameter datatype in a header file?

我是 C 的新手,对于 header 文件中参数的 extern 声明函数中使用的框架特定数据类型存在以下问题。

//FILE: example.h

extern void my_function(void *);
//FILE: example.c

#include "example.h"
#include "freertos/task.h"

void my_function(TaskHandle_t _taskHandle){
 //function body
}

数据类型 TaskHandle_t 当然在 header 中是未知的,因为我也必须在此处包含自由数据 header。我听说在 header 文件中包含其他 header 文件是不好的做法。

如果我尝试编译上面的示例,则会出现以下错误:

error: conflicting types for 'my_function'
 void my_function(TaskHandle_t _taskHandle)

解决这个问题的最佳方法是什么?

与您提到的最佳实践形成鲜明对比的是,我遵循我认为的规则:

“包括你需要的。不要包括你不需要的。”

我非常支持 M. Oehm:

If a header file requires definitions from other header files, it should include that header. It sure isn't any worse practice than trying to work around it by using void *.

前向声明结构的概念允许在详细包含或类型定义结构之前使用 pointer-to-that。 (正如评论中提到的,是一些程序员。)

如果 TaskHandle_t 是指向结构的指针,那么您可以转发声明结构并为指向它的指针添加别名。

typedef struct TaskHandle_s *TaskHandle_t;
void my_function(TaskHandle_t _taskHandle);

声明一个未知的数据类型是您应该在 header 中包含 header 的唯一充分理由。然而,还有 so-called 'forward declaration',当您需要将指针传递给结构时可以使用它。 (或 C++ 中的 class)

前向声明看起来像这样:

//.h file
struct YourType;
void yourFunction(struct YourType *variable);

//.c file
#include "HeaderContainingYourType.h"

void yourFunction(struct YourType *variable)
{
}

至于你的具体问题,你的原型和你的声明必须有完全相同的签名,所以如果你用void *声明原型,你也必须在声明中使用void *

解决问题的方法:

  • 包括您需要的 header 文件。
  • 从 header 文件中取出 typedef 并在新的 header 文件中逐字重新声明它。
  • 传递 void * 并将其转换为 C 文件中的适当类型。

请注意,第三种方法否定了 'typesafety' 的方面,因为您可以将任何内容传递给 void *