获取尝试在功能

问题描述:

通过地址时,警告我得到警告:获取尝试在功能

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

这意味着您的呼叫应该是(不&):

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

g_AgMgrCtx.SDevAddr是18个字符阵列。所以当你将它传递给一个函数时,它会被转换成一个指向它的第一个元素的指针(因此匹配AG_AS()期望的类型)。

相关:What is array decaying?

当你有这样

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 *