让我们有这样的结构:
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用循环替换这些多个条件?
最好的方法可能是打字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)