如何循环结构成员?

Bis*_*iyo 2 c

让我们有这样的结构:

struct _Example {
    int a;
    int b;
    int c;
} Example;
Run Code Online (Sandbox Code Playgroud)

一个函数通过指针获取此结构并输出struct成员的值.我想打印这样的值:

Example example;
func(&example);

if(example.a)
    printf("%d", example.a);

if(example.b)
    printf("%d", example.b);

if(example.c)
    printf("%d", example.c);
Run Code Online (Sandbox Code Playgroud)

如何if用循环替换这些多个条件?

Lun*_*din 8

最好的方法可能是打字union.它允许您使用具有不同变量表示的相同内存区域,例如通过为每个结构成员提供单独的名称,同时保持循环它们.

#include <stdio.h>

typedef union {
  struct  // anonymous struct, requires standard C compiler
  {
    int a;
    int b;
    int c;
  };
  int array[3];
} Example;


int main (void)
{
  Example ex = { .a=1, .b=2, .c=3 };

  for(size_t i=0; i<3; i++)
  {
    printf("%d\n", ex.array[i]);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你不能改变结构定义,那么第二个最好的是通过字符类型的一些指针算术.这需要更加谨慎,因此您最终不会编写具有定义不明确的行为的代码 - 您需要了解对齐和严格别名等内容.如果结构随着不同类型的成员变得更复杂,则首选字符类型,因为字符类型可以避免别名问题.

假设uint8_t是一个字符类型,那么:

#include <stdio.h>
#include <stdint.h>

typedef union {
  struct
  {
    int a;
    int b;
    int c;
  };
} Example;


int main (void)
{
  Example ex = { .a=1, .b=2, .c=3 };
  uint8_t* begin = (uint8_t*)&ex;
  uint8_t* end   = begin + sizeof ex;


  for(uint8_t* i=begin; i!=end; i+=sizeof(int))
  {
    printf("%d\n", *(int*)i);
  }
}
Run Code Online (Sandbox Code Playgroud)