如何在 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 *
。
我是 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 *
。