IN_ADDR结构在android中奇怪定义

gam*_*eus 3 c c++ android struct android-ndk

我试图在Android上编译网络代码并看到编译错误.我正在使用的结构是ip_mreq_source,它应该在头文件中定义,如下所示:

struct ip_mreq_source {
  struct in_addr imr_multiaddr;
  struct in_addr imr_sourceaddr;
  struct in_addr imr_interface;
};
Run Code Online (Sandbox Code Playgroud)

其中in_addr应定义为:

typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };
Run Code Online (Sandbox Code Playgroud)

来自基于Android的编译器的g ++(GCC 4.4.3)中出现的详细错误:

    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'
Run Code Online (Sandbox Code Playgroud)

我不确定导致错误的原因.任何指针都会很棒 - 没有任何双关语.谢谢

gam*_*eus 5

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

原来Android平台的g ++包含文件非常有限.这些头文件中结构的定义如下:

struct in_addr
  {
    __u32 s_addr;
  };
Run Code Online (Sandbox Code Playgroud)

和:

struct ip_mreq_source {
  __u32 imr_multiaddr;
  __u32 in_addr imr_sourceaddr;
  int some_other_var
};
Run Code Online (Sandbox Code Playgroud)

所以我的struct2,struct3和struct4实际上是__u32(在asm/types.h中定义的无符号整数),甚至在这个旧版本中都没有结构.为解决这个问题,我将用法改为:

struct struct1 st1;
st1.struct2 = Value
Run Code Online (Sandbox Code Playgroud)

代替:

struct struct1 st1;
st1.struct2.s = Value;
Run Code Online (Sandbox Code Playgroud)

谢谢你带领我走正路.

;