C++11 程序可以使用 BlueZ 吗?

Can a C++11 program use BlueZ?

我在使用 BlueZ 库编译简单的 C++11 程序时遇到问题:

#include <bluetooth/bluetooth.h>
int main() {}

在我的 Fedora 21 机器上用 g++ -std=c++11 main.cpp 编译它得到:

In file included from ../scale.cpp:1:0:
/usr/include/bluetooth/bluetooth.h: In function ‘uint64_t bt_get_le64(const void*)’:
/usr/include/bluetooth/bluetooth.h:177:9: error: expected identifier before ‘*’ token
  return bt_get_unaligned((const uint64_t *) ptr);
         ^
...

这是 BlueZ 版本 5.23 和 GCC 4.9.2。如果我删除 -std=c++11 标志,一切正常。

这正常吗?

默认情况下,GCC 编译为带有 GNU 扩展的 C++03。如果您指定 -std=C++11 则它会编译为 ISO C++11 且不启用任何扩展。但是,如果您指定 -std=gnu++11,那么您也会获得 GNU 扩展。

bluetooth.h 中存在问题,只需将 typeof 替换为 __typeof__ 即可解决,这里有一个参考:http://git.kernel.org/cgit/bluetooth/bluez.git/commit/lib/bluetooth.h?id=cf52a40302d0d20ccca22a7a1f53e46ef8abfca8