【发布时间】:2019-12-20 22:56:50
【问题描述】:
我处理了netlink API 并检查了它的手册页netlink(3) 和netlink(7)。
突然间我遇到了这样的结构:
struct msghdr msg;
msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
我在 C 中尝试过,但它给出了错误:
错误:“{”标记之前的预期表达式
显然是c++(我不知道什么标准)。
当然很明显,Netlink 是一个 API,没有特定的语言绑定。但这是 C 实现,我看到的所有关于 C API 的 MAN 页面都有纯 C 示例。为什么没有关于示例中使用的语言的注释?这种做法是为了什么,为什么这不是 f.e.在 Python 上还是什么?
UPD:我认为这不是 MAN 页面中的拼写错误或无意错误。还有一些其他地方使用了这个 C++ 特性,例如:
struct iovec iov = { buf, sizeof(buf) };
struct sockaddr_nl sa;
struct msghdr msg;
struct nlmsghdr *nh;
msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
len = recvmsg(fd, &msg, 0);
for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);
nh = NLMSG_NEXT (nh, len)) {
...
看起来像是有意识地选择了 C++。
【问题讨论】:
-
问题是举一个小例子并断言它适用于更广泛.. 问题真的是“为什么 这个特定的 [netlink] 手册页 提供了一个不在本地编译为 C?” (也许是提交错误报告。)
-
@Eljay 可以初始化,但不能这样赋值。
-
我认为这只是一个反常现象。通常 Unix 手册页使用 C 语法,我认为这本书的作者搞砸了。
-
他可能是想写
struct msghdr msg = { ... };,但出于某种原因,他将它们分成了单独的语句。 -
示例在
C++中编译,但不是纯C++代码(看起来有点不同)。我想说这是C代码,带有一个小的 C++ 特性。这里是equivalent examle。基本上是文档中的错误,它是如此轻松以至于被所有人忽略。
标签: netlink c++ c++ c linux manpage netlink