我向大家打招呼。
我關于 C 的問題。是否可以直接在其介面中轉換函式的引數型別?
<linux/serial_core.h>包含
struct uart_port {
many elements
}
在內核 v5.4 中,其中之一是,unsigned char unused[2];
但后來它被洗掉了。Linux_doc 建議創建自己的結構并注冊它,從開始輸入內核的結構,然后添加所需的其他內容,例如
typedef uart_port_15 {
struct uart_port port;
unsigned char unused[32];
} uart_port_15;
我試圖糾正的設備驅動程式包含大量功能,期望struct uart_port *P. 在文本中,將指向結構的指標轉換為第一個元素上的指標或回傳是沒有問題的,但是可以在函式標題中使用它嗎?
簡單的例子
int func(struct uart_port *p) {
something
}
我可以直接在 func 的呼叫中轉換struct uart_port_15 *p1或&(struct uart_port_15 *p1->port)
轉換嗎?struct uart_port *p我嘗試了不同的變體,但沒有成功。
感謝您的回答。例如
#include <linux/serial.h>
#include <linux/serial_core.h>
typedef uart_port_15 {
struct uart_port port;
unsigned char unused[32];
} uart_port_15;
int func1((struct uart_port *)(struct uart_port_15 *p)){
}
int func2((struct uart_port *)(struct uart_port_15 *p1) p){
}
int func3((struct uart_port *)&(struct uart_port_15 *p1->port)){
}
int func4((struct uart_port *)(struct uart_port_15 *p1) p){
}
int func5((struct uart_port *p)&(struct uart_port_15 *p1->port)){
}
這些都不起作用,其他也不起作用。gcc 在 (struct uart_port *) 之前寫入“宣告說明符需要”。也許我不了解 C 語法或想要不可能的事情。
編譯了下一個變體:
#include <linux/serial.h>
#include <linux/serial_core.h>
typedef uart_port_15 {
struct uart_port port;
unsigned char unused[32];
} uart_port_15;
struct uart_port_15 *p1;
struct uart_port * p_152p(struct uart_port_15 *);
struct uart_port * p_152p(struct uart_port_15 *p){
return (struct uart_port *)p;
}
int func(struct uart_port * p_152p(struct uart_port_15 *p1)){
}
但這不是我需要的。我需要這個函式(func)具有介面“int func(struct uart_port *)”,因為指向它的指標必須分配給struct中的指標,它的元素等待這種型別,但func的引數型別在這種呼叫時發生了變化。
就我而言,我不能使用答案中的建議。我必須通過預定義型別(struct uart_port *p)來提供函式。
uj5u.com熱心網友回復:
是否可以直接在其介面中轉換函式的引數型別?
不,您所說的“介面”是一個宣告,它告訴編譯器要呼叫的函式。它不定義呼叫函式時要執行的操作,除了引數型別到引數型別的自動轉換。這些自動轉換不會在指向不同結構型別的指標之間轉換。
通常,在呼叫函式時在指向不同結構型別的指標之間進行轉換是一些錯誤的標志。但是,如果您想這樣做,您可以簡單地定義一個輔助函式來進行轉換。例如:
// Declaration of original function to be called.
int foo(struct FooStructure *p);
// Definition of alternate interface to function.
static int bar(struct BarStructure *p)
{
// Convert pointer and call original function.
foo((struct FooStructure *) p);
}
您可以更進一步并定義一個宏來用替代函式替換原始函式的使用:
#define bar foo
如上所述,這可能是一個壞主意,應該避免。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/518360.html
標籤:C
上一篇:無法列印檔案的最后一行
