首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在安卓中奇怪地定义了IN_ADDR结构

在安卓中奇怪地定义了IN_ADDR结构
EN

Stack Overflow用户
提问于 2011-02-18 19:10:05
回答 3查看 3.1K关注 0票数 3

我试图在android上编译网络代码,但发现了编译错误。我使用的结构是ip_mreq_source,它应该在header中定义如下:

代码语言:javascript
复制
struct ip_mreq_source {
  struct in_addr imr_multiaddr;
  struct in_addr imr_sourceaddr;
  struct in_addr imr_interface;
};

其中in_addr应定义为:

代码语言:javascript
复制
typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

我的详细错误来自基于安卓的编译器的g++ (GCC 4.4.3):

代码语言:javascript
复制
    arm-linux-androideabi-g++ -MMD -MP -MF groupsock/GroupsockHelper.o.d.org -fpic
 -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ 
-D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float 
-fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-
limit=64 -Igroupsock/include -Igroupsock/../UsageEnvironment/include -Iandroid-
ndk-r5b/sources/cxx-stl/system/include -Igroupsock -DANDROID  -Wa,--noexecstack 
-DANDROID_NDK -Wall -fexceptions  -O2 -DNDEBUG -g   -Iandroid-8/arch-arm/usr/include -c  
groupsock/GroupsockHelper.cpp -o groupsock/GroupsockHelper.o && rm -f 
groupsock/GroupsockHelper.o.d && mv groupsock/GroupsockHelper.o.d.org 
groupsock/GroupsockHelper.o.d
groupsock/GroupsockHelper.cpp: In function 'Boolean socketJoinGroupSSM(UsageEnvironment&, int, netAddressBits, netAddressBits)':
groupsock/GroupsockHelper.cpp:427: error: request for member 's_addr' in 'imr.ip_mreq_source::imr_multiaddr', which is of non-class type '__u32'
groupsock/GroupsockHelper.cpp:428: error: request for member 's_addr' in 'imr.ip_mreq_source::imr_sourceaddr', which is of non-class type '__u32'
groupsock/GroupsockHelper.cpp:429: error: request for member 's_addr' in 'imr.ip_mreq_source::imr_interface', which is of non-class type '__u32'

我不确定是什么导致了这个错误。任何指针都很棒--没有双关语的意思。谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-02-20 23:21:31

感谢大家的帮助。我能够追踪到我使用的android g++编译器的包含文件版本中的不同结构定义的错误。

原来Android平台的g++包含文件是相当受限制的。这些标头中的结构的定义是这样的:

代码语言:javascript
复制
struct in_addr
  {
    __u32 s_addr;
  };

和:

代码语言:javascript
复制
struct ip_mreq_source {
  __u32 imr_multiaddr;
  __u32 in_addr imr_sourceaddr;
  int some_other_var
};

因此,我的struct2、struct3和struct4实际上是__u32 (如asm/typees.h中定义的无符号整数),甚至在这个旧版本中都不是结构。为了解决这个问题,我将我的用法更改为:

代码语言:javascript
复制
struct struct1 st1;
st1.struct2 = Value

而不是:

代码语言:javascript
复制
struct struct1 st1;
st1.struct2.s = Value;

不过还是要感谢你给我指引了正确的方向。

票数 5
EN

Stack Overflow用户

发布于 2011-02-18 21:23:40

下面的工作没有问题,你的问题是什么?

代码语言:javascript
复制
#include <stdint.h>

typedef uint32_t in_addr_t;

struct x {
  in_addr_t s;
};

struct foo {
  x a;
  x b;
  x c;
};

int main() {
  uint32_t v = 5;
  foo f;

  f.a.s = v;

  return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2011-02-18 21:29:59

您提供的代码示例没有任何错误。唯一明智的解释是,在某个地方有一个#define与'x‘的名称冲突,并将其替换为'__u32’(unsigned int?)。

您应该尝试对有问题的源文件(g++的-E标志)进行预处理,以执行宏扩展,并检查输出中'struct1‘的定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5040558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档