我對 C 非常陌生,并且對于在 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
在標頭中當然是未知的,因為我也必須在此處包含 freertos 標頭。我聽說在頭檔案中包含其他頭檔案是不好的做法。
如果我嘗試編譯上面的示例,則會引發以下錯誤:
error: conflicting types for 'my_function'
void my_function(TaskHandle_t _taskHandle)
解決這個問題的最佳方法是什么?
uj5u.com熱心網友回復:
與您提到的最佳實踐相比,我遵循我認為的規則:
“包括你需要的。不要包括你不需要的。”
我非常贊同 M. Oehm:
如果一個頭檔案需要來自其他頭檔案的定義,它應該包含那個頭檔案。這肯定不是比嘗試使用 void * 來解決它更糟糕的做法。
前向宣告結構的概念允許在詳細包含或型別定義結構之前使用指向該結構的指標。(正如評論中提到的,是一些程式員老兄。)
uj5u.com熱心網友回復:
宣告一個未知的資料型別是您應該在標頭中包含標頭的唯一充分理由。然而,還有所謂的“前向宣告”,當您需要將指標傳遞給結構時,您可以使用它。(或 C 中的類)
前向宣告看起來像這樣:
//.h file
struct YourType;
void yourFunction(struct YourType *variable);
//.c file
#include "HeaderContainingYourType.h"
void yourFunction(struct YourType *variable)
{
}
至于你的具體問題,你的原型和你的宣告必須有完全相同的簽名,所以如果你用 宣告原型void *
,你也必須void *
在宣告中使用。
解決您的問題的方法:
- 包括你需要的頭檔案。
- 從頭檔案中取出 typedef 并在新的頭檔案中逐字重新宣告它。
- 將其傳遞
void *
并轉換為 C 檔案中的適當型別。
請注意,第三種方法否定了“型別安全”的方面,因為您可以將任何內容傳遞給void *
.
uj5u.com熱心網友回復:
如果TaskHandle_t
是指向結構的指標,那么您可以轉發宣告該結構并為指向它的指標添加別名。
typedef struct TaskHandle_s *TaskHandle_t;
void my_function(TaskHandle_t _taskHandle);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477678.html
上一篇:鏈表樹執行程序中出現錯誤
下一篇:memccpy如何處理大整數值?