---
# System prepended metadata

title: Camera OV7670 第04段 typedef void (Fun) (void)

---

# Camera OV7670 第04段 typedef void (Fun) (void)
```javascript=
void processGrayscaleFrameBuffered();  //緩衝處理灰度幀
void processGrayscaleFrameDirect();    //直接處理灰度幀
void processRgbFrameBuffered();        //緩衝處理RGB幀
void processRgbFrameDirect();          //直接處理RGB幀
typedef void (*ProcessFrameData)(void) ;
                                 
                                 
#if UART_MODE==5
const uint16_t lineLength = 320;
const uint16_t lineCount = 240;
const uint32_t baud  = 500000;
const ProcessFrameData processFrameData = processRgbFrameBuffered;
const uint16_t lineBufferLength = lineLength * 2;
const bool isSendWhileBuffering = true;  //這是在緩衝時發送
const uint8_t uartPixelFormat = UART_PIXEL_FORMAT_RGB565;
CameraOV7670 camera(CameraOV7670::RESOLUTION_QVGA_320x240, CameraOV7670::PIXEL_RGB565, 32);
#endif
```

## 是甚麼 typedef void (Fun) (void)

typedef能讓 my變成int的功能

```javascript=
int i ;// 定義整數i
typedef int my;
my j; //定義整數j
```

### 函數指針
```javascript=
#include <iostream>
using namespace std;
char (*pFun)(int);
//定義一個函數指針"*pFun"
//他指向一個返回類型為char,有一個整數的參數函數

//定義一個返回類型char, 參數為int的函數
//從指針層面上理解該函數,即函數的函數名實際上是一個指針
//該指針指向函數在內存中的首地址
char glFun(int a){
	cout  <<a;
	//return a;
	}
int main (){
	pFun = glFun;//將函數gLFun的地址賦值給pFun
    
//"pFun"顯然是取pFun所指向地址的內容
//當然也就是取出了函數glFun()的內容,然後給定參數為2
	(*pFun)(2);
	return 0;
	{
``` 

### typedef可以讓函數指針更直觀方便
typedef的功能是定義新的類型，
並定義這種類型為指向某種函數的指針


```javascript=
//這種函數以一個int為參數並返回char類型。
//後面就可以像使用int,char一樣使用PTRFUN了。
typedef char (*PTRfun)(int);
PTRfun pFun;//使用這個新類型定義了變量pFun，此時就可以像使用形式1一樣使用這個變量了
char glFun(int a){return;}
void main(){
	pFun = glFun;
	(*pFun)(2);
}</span>
```

參考網站(https://blog.csdn.net/u014221279/article/details/50978204)

:::spoiler 延伸閱讀 函數指針

“返回值類型”説明函數的返回類型，“(指針變量名 )”中的括號不能省
括號改變了運算符的優先級。若省略整體則成為一個函數説明

説明了一個返回的數據類型是指針的函數，
後面的“形參列表”表示指針變量指向的函數所帶的參數列表。

例如：
```javascript=
int func(int x);         / 聲明一個函數 /
int (*f) (int x);         / 聲明一個函數指針 /
f=func;                  / 將func函數的首地址賦給指針f /
或者使用下面的方法將函數地址賦給函數指針：
f = &func;
```
賦值時函數func不帶括號，也不帶參數，由於func代表函數的首地址，
因此經過賦值以後，指針f就指向函數func(x)的代碼的首地址。
:::

