[英]typedef in C and function pointers
我有一些結構和相應的函數可以在他們自己的 header 和 c 文件中編寫。
我想知道是否有可能創建一個新的 header 和 c 文件,用於使用新的適當描述性聲明“繼承”這些特定類型和函數的代碼? 是否可以以這種方式對函數和結構進行 typedef 以重用代碼?
我研究了 function 指針,但我不確定這是否是實現我所追求的正確工具。 我想另一種選擇是重構代碼,以便名稱是通用的。
代碼示例:
// function1.h
typedef struct src_data {
...
} src_data;
src_data* process_src_data(...) {
...
return new_data;
}
// function2.h
#include "function1.h"
typedef src_data dest_data;
typedef dest_data* (*process_dest)(void);
process_dest process_dest_data = &process_src_data;
用法如下:
#include "function1.h"
#include "function2.h"
src_data *sourceData = process_src_data(...);
dest_data *destinationData = process_dest_data(...);
一個粗略而簡單的解決方案:
// function2.h
#define process_dest_data process_src_data
更好的方法是使用static inline
函數作為包裝器:
// function2.h
static inline dest_data* process_dest_data(void) {
return process_src_data();
}
使用inline
將幫助您避免有關未使用函數的警告。
兩者都可能導致類似的 object 代碼。
與包裝器相比,宏有一個微妙的優勢。 假設process_src_data
有外部鏈接。 表達式&process_dest_data
在每個翻譯單元中可能具有不同的值。 如果使用宏,則值將相同,等於&process_src_data
。
如果可以為代碼創建一個新的 header 和 c 文件,以使用新的適當描述性聲明“繼承”這些特定類型和函數?
C 是一種非常(現在)簡單的語言,您必須自己編寫很多代碼。 其他語言 - 特別是考慮面向對象的語言,C++,Java - 具有內置的“繼承”功能,該語言本身允許將所有 ZC1C425268E687A94D1AB5074C1 從一個地方“導入”到另一個地方。
C 沒有此功能。 在 C 中,您必須自己從頭開始編寫所有內容。
我不確定這是否正確
// function1.h
src_data* process_src_data(void) { /* NO */ }
而是將功能聲明放在 header 和源文件中的定義中。
// function1.h
src_data* process_src_data(void); //ok
// function1.c
src_data* process_src_data(void) { ok(); }
否則它不是“正確的”,從某種意義上說,包含鏈接在一起的 header 的多個.c
文件將導致“多個定義”問題。
// function2.h
process_dest process_dest_data = &process_src_data;
Either make the function pointer static
, or move it to separate C source file and add extern
to the header. 如果它打算保持不變,另外添加const
,因此可以將其優化為只讀部分而不使用 RAM。
// function2.h
extern const process_dest process_dest_data;
// function2.c
const process_dest process_dest_data = &process_src_data;
實現我所追求的工具。
Function 指針取 memory。 調用 function 指針需要取消引用它們。 它們很難優化。
在 C 中編寫簡短的static
包裝函數是典型的:
// function2.h
static process_dest process_dest_data(void) {
return process_src_data();
}
如果 function 很短,它會被編譯器內聯並從生成的可執行文件中刪除。 更長時間,只需編寫一個調用底層實現的常規 function 即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.