获取尝试在功能
问题描述:
通过地址时,警告我得到警告:获取尝试在功能
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];
什么是合格的解决这一问题?当我删除&
时,警告消失。
警告实际上意味着什么?
答
这意味着您的呼叫应该是(不&
):
AG_AS(g_AgMgrCtx.audio_device.Profile_Type, g_AgMgrCtx.SDevAddr);
g_AgMgrCtx.SDevAddr
是18个字符阵列。所以当你将它传递给一个函数时,它会被转换成一个指向它的第一个元素的指针(因此匹配AG_AS()
期望的类型)。
答
当你有这样
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 *
。
数组地址产生一个指向数组的指针。使用数组名称会生成指向数组的第一个元素的指针。类型完全不同。当你不需要它时不要使用'&' –
它说'const CHAR *'和CHAR(*)[18]'不一样。 – Olaf