我有一段代码,它获取本地IPv6地址。 gcc和clang与std = c99在这些行上崩溃:
ipv6addr.s6_addr16[i] = htons((unsigned short int)tmp);
if (!(IN6_IS_ADDR_LOOPBACK(ipv6addr.s6_addr32)
|| IN6_IS_ADDR_UNSPECIFIED(ipv6addr.s6_addr32)
|| IN6_IS_ADDR_LINKLOCAL(ipv6addr.s6_addr32))){
ipv6.c:43:13: error: no member named 's6_addr16' in 'struct in6_addr'
ipv6addr.s6_addr16[i] = htons((unsigned short int)tmp);
~~~~~~~~ ^
ipv6.c:45:39: error: no member named 's6_addr32' in 'struct in6_addr'
if (!(IN6_IS_ADDR_LOOPBACK(ipv6addr.s6_addr32)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
等
使用标准选项进行编译会获得成功。这是为什么? 完整来源位于http://pastebin.com/hQ3VBSKe
答案 0 :(得分:2)
从2007年至2009年的相关帖子判断,似乎是一个OSX工件,
+#if defined(__APPLE__) || defined(__darwin__)
+/* OSX seems not to define these. */
+#ifndef s6_addr16
+#define s6_addr16 __u6_addr.__u6_addr16
+#endif
+#ifndef s6_addr32
+#define s6_addr32 __u6_addr.__u6_addr32
+#endif
+#endif
http://archives.seul.org/or/cvs/Jul-2007/msg00167.html
另外,
RFC 2553,UNP和SUS,in6_addr {}只需要s6_addr
答案 1 :(得分:0)
请参阅in6_addr中的struct声明。您需要编译为gnu99才能获得扩展。
BTW错误!=崩溃