我在Ubuntu下使用蓝牙库的C/C++程序的g++和编译过程中遇到了一些问题。
如果我使用gcc,它可以在没有警告的情况下工作;相反,如果我使用g++,我会得到以下警告:
警告:获取临时地址
即使程序编译得很好而且工作正常。
报告错误的相关行是:
bdaddr_t *inquiry(){
// do some stuff..
bacpy(&result[mote++], BDADDR_ANY);
return result;
}
//...
void zeemote(){
while (bacmp(bdaddr, BDADDR_ANY)){
/..
}
}
在这两种情况下,都涉及到BDADDR_ANY。
我该怎么解决这个警告呢?
BDADDR_ANY是用蓝牙定义的,类似于:
/* BD Address */
typedef struct {
uint8_t b[6];
} __attribute__((packed)) bdaddr_t;
#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
发布于 2012-03-17 16:35:56
(&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
构造临时对象并使用其地址。这在C++是不允许的。
您可以通过创建一个命名的临时变量并在其上使用bacpy
和bacmp
来修复这个问题:
bdaddr_t tmp = { };
bacpy(&result[mote++], &tmp);
和
while (bacmp(bdaddr, &tmp)) {
//
}
发布于 2012-03-17 16:40:26
创建一个变量(在任何方便的范围内),而不是临时的.
bdaddr_t my_bdaddr_any = { 0 };
while (bacmp(bdaddr, my_bdaddr_any))
...
发布于 2019-08-04 17:54:37
如果您查看蓝牙.h文件,您将看到您只需在C++中通过以下操作就可以做到这一点
bdaddr_t bdaddr_any = {{0, 0, 0, 0, 0, 0}};
sockaddr_rc server;
server.rc_family = AF_BLUETOOTH;
server.rc_bdaddr = bdaddr_any;
server.rc_channel = (uint8_t)1;
https://stackoverflow.com/questions/9751710
复制相似问题