2016-09-06 91 views
0

通過地址時,警告我得到警告:獲取嘗試在功能

expected 'const CHAR *' but argument is of type 'CHAR (*)[18]' 

爲什麼編譯器給我這個警告呢?這是我用來調用API的行:

AG_AS(g_AgMgrCtx.audio_device.Profile_Type,&g_AgMgrCtx.SDevAddr); 

函數的聲明是

AG_AS(AG_DType d_type , CHAR *addr); 
char SDevAddr[18]; 

什麼是合格的解決這一問題?當我刪除&時,警告消失。

警告實際上意味着什麼?

+2

數組地址產生一個指向數組的指針。使用數組名稱會生成指向數組的第一個元素的指針。類型完全不同。當你不需要它時不要使用'&' –

+1

它說'const CHAR *'和CHAR(*)[18]'不一樣。 – Olaf

回答

2

這意味着您的呼叫應該是(不&):

AG_AS(g_AgMgrCtx.audio_device.Profile_Type, g_AgMgrCtx.SDevAddr); 

g_AgMgrCtx.SDevAddr是18個字符陣列。所以當你將它傳遞給一個函數時,它會被轉換成一個指向它的第一個元素的指針(因此匹配AG_AS()期望的類型)。

相關:What is array decaying?

0

當你有這樣

T obj; 

其中T是某種類型的對象然後表達&obj具有類型T *即它是一個指向T類型的對象。

此數組宣言

char SDevAddr[18]; 

可轉化爲上述使用一個typedef所示的形式。例如

typedef char T[18]; 
T SDevAddr; 

在這種情況下表達&SDevAddr具有類型T *因爲它已被上面所指出的。然而在這種情況下,T依次是類型char[18]的別名。因此&SDevAddr是指向char[18]類型的對象的指針,其類型看起來像char (*)[18]

然而,因爲它是從函數聲明

AG_AS(AG_DType d_type , CHAR *addr); 

第二參數的類型是char *看出。如果您將參數傳遞爲數組本身,如SDevAddr那麼它將被隱式轉換爲指向其第一個元素的指針,並且將具有函數調用所需的類型char *