簡體   English   中英

C 和 function 指針中的 typedef

[英]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 中,您必須自己從頭開始編寫所有內容。

我不確定這是否正確

  1. 不要在 header 文件中定義函數。 不要:

// 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文件將導致“多個定義”問題。

  1. 與 function 指針聲明類似:

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM