C / C ++警告:BDADDR_ANY蓝牙库的临时地址

时间:2012-03-17 16:33:44

标签: c++ c ubuntu bluetooth temporary

我在g ++和使用Ubuntu下的蓝牙库的C / C ++程序的编译过程中遇到了一些问题。

如果我使用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在bluetooth.h中定义,如:

/* BD Address */
typedef struct {
    uint8_t b[6];
} __attribute__((packed)) bdaddr_t;

#define BDADDR_ANY   (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})

3 个答案:

答案 0 :(得分:4)

(&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})

构造一个临时对象并使用其地址。这在C ++中是不允许的。

您可以通过创建命名的临时变量并在其上使用bacpybacmp来解决此问题:

bdaddr_t tmp = { };

bacpy(&result[mote++], &tmp);

while (bacmp(bdaddr, &tmp)) {
    //
}

答案 1 :(得分:2)

创建一个变量(在任何方便的范围内)而不是临时的......

bdaddr_t my_bdaddr_any = { 0 };
while (bacmp(bdaddr, my_bdaddr_any))
    ...

答案 2 :(得分:0)

如果您查看bluetooth.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;