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
我在使用 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