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

问题描述 投票:0回答:4

我在 Ubuntu 下使用 g++ 和使用蓝牙库的 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}})
c++ c ubuntu bluetooth temporary
4个回答
5
投票
(&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})

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

您可以通过创建一个命名临时变量并在其上使用

bacpy
bacmp
来解决此问题:

bdaddr_t tmp = { };

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

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

2
投票

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

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

1
投票

如果你查看 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;

0
投票

无法在有效的 C++ 中使用

BDADDR_*
宏。您必须手动复制这些值:

static constexpr bdaddr_t bdaddr_any{{0, 0, 0, 0, 0, 0}};
static constexpr bdaddr_t bdaddr_all{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
static constexpr bdaddr_t bdaddr_local{{0, 0, 0, 0xff, 0xff, 0xff}};

使用示例:

sockaddr_rc addr{
    .rc_family = AF_BLUETOOTH,
    .rc_bdaddr = bdaddr_any,
    .rc_channel = 1
};

m_session = sdp_connect(&bdaddr_any, &bdaddr_local, SDP_RETRY_IF_BUSY);
© www.soinside.com 2019 - 2024. All rights reserved.