搜索
bottom↓
回复: 11

请教一个结构体问题,C语言如何判断结构体成员数据类型

[复制链接]

出0入0汤圆

发表于 2024-1-2 09:10:58 | 显示全部楼层 |阅读模式
typedef struct
{
u8 DAT1;
u16 DAT2;
u32 DAT3;
u8 DAT4[2];
}AAAA;

比如这个结构体里面有好多种数据类型,有没有什么办法可以快速判断数据类型

出0入984汤圆

发表于 2024-1-2 09:26:31 | 显示全部楼层
sizeof? typeof?

出0入42汤圆

发表于 2024-1-2 09:26:53 | 显示全部楼层
你是要搞反射?

出0入0汤圆

 楼主| 发表于 2024-1-2 09:54:06 | 显示全部楼层
如果结构体里面数据比较多,处理起来麻烦,代码好长,如果有什么办法直接可以if()  可以知道是单个变量,还是数组

出0入33汤圆

发表于 2024-1-2 10:05:34 来自手机 | 显示全部楼层
C结构体里面的数据类型和位置都是固定的,为何还要判断类型?一定要判断的话可以通过计算成员指针相对结构体指针的位置来判断。不过要注意字节对齐问题。

出615入1076汤圆

发表于 2024-1-2 10:19:18 | 显示全部楼层
见 C11 新增的关键字 _Generic

https://www.amobbs.com/thread-5741754-1-1.html

出1310入193汤圆

发表于 2024-1-2 10:31:50 | 显示全部楼层
  1. #include <stdio.h>

  2. typedef enum {
  3.     TYPE_U8,
  4.     TYPE_U16,
  5.     TYPE_U32,
  6.     TYPE_U8_ARRAY
  7. } DataType;

  8. typedef struct {
  9.     DataType type;
  10.     union {
  11.         u8 DAT1;
  12.         u16 DAT2;
  13.         u32 DAT3;
  14.         u8 DAT4[2];
  15.     } data;
  16. } AAAA;

  17. void printData(AAAA* a) {
  18.     switch (a->type) {
  19.         case TYPE_U8:
  20.             printf("DAT1: %u\n", a->data.DAT1);
  21.             break;
  22.         case TYPE_U16:
  23.             printf("DAT2: %u\n", a->data.DAT2);
  24.             break;
  25.         case TYPE_U32:
  26.             printf("DAT3: %u\n", a->data.DAT3);
  27.             break;
  28.         case TYPE_U8_ARRAY:
  29.             printf("DAT4[0]: %u, DAT4[1]: %u\n", a->data.DAT4[0], a->data.DAT4[1]);
  30.             break;
  31.         default:
  32.             printf("Unknown data type\n");
  33.     }
  34. }
复制代码

出0入0汤圆

发表于 2024-1-2 10:46:31 | 显示全部楼层
楼主,能否说下这是要用在啥地方的?为啥要去判断结构体成员数据类型

出200入2554汤圆

发表于 2024-1-2 10:57:21 | 显示全部楼层
得分情况讨论:

a. 你在源码阶段已有 struct 定义,这之后你用 sizeof、& 都可以判定数据尺寸,进而判断;

b. 你在源码阶段未知 struct 定义,类似于串流过来一个 void* 和 sizeof(packet),需要你动态判断结构体内部数据,
    这种情况在 C 里边无解,因为串流可以翻译成任意的结构体,除非自定协议描述其中数据类型。

出0入16汤圆

发表于 2024-1-2 11:11:42 | 显示全部楼层
为什么要判断,指针扎?数据流转结构体吗,序列化反序列化?

出0入0汤圆

发表于 2024-1-2 12:34:42 | 显示全部楼层
6楼的应该可以,回头试试

出50入135汤圆

发表于 2024-1-2 16:41:12 来自手机 | 显示全部楼层
6楼的,我在下keil下试了可以
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 19:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表