首页 > 其他分享 >c语言借助GNU创建对象和嵌套union使用

c语言借助GNU创建对象和嵌套union使用

时间:2022-11-05 15:12:42浏览次数:46  
标签:__ name GNU union age 创建对象 person type void

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 
 * 枚举体占用内存
 * 枚举有符号,根据数值分配内存。[1~4]
 * 但是和编译器相关联,目前我看到的都是4byte
 */
typedef enum {
  MONKEY_TYPE = 0,
  DOG_TYPE = 1,
}object_type_t;
typedef struct{
  char name[10];
  unsigned char age;
}__attribute__((packed)) monkey;
typedef struct{
  char name[10];
  unsigned char age;
} __attribute__((packed)) dog;
/* 结构体嵌套共用体,用一个标记字段来区分union中存储的是什么,节约内存,非常常用这种方法 */
typedef struct 
{
  object_type_t type;
  /* 取消字节对齐 */
  union {
   monkey m;
   dog d;
  } __attribute__((packed));
}__attribute__((packed)) person;

/* c 语言创建对象方法 */
#define VLIB_INIT_PERSON(x) \
  person* x;                \
  static void __attribute__((constructor)) init_person();\
  static void init_person()\
  {\
    printf("init a person\n");\
    x = (person*)malloc(sizeof(person));\
  }\
  static void __attribute__((destructor)) free_person();\
  static void free_person()\
  {\
    printf("free has been finished!\n");\
    free(x);\
  }\
  static void print(const person *p);\
  static void print(const person *p) \
  {\
    switch (p->type) {\
      case MONKEY_TYPE:\
        printf("{type:monkey; name:%s; age:%u;}\n", p->m.name, p->m.age);\
        break;\
      case DOG_TYPE:\
        printf("{type:dog; name:%s; age:%u;}\n", p->d.name, p->d.age);\
        break;\
      default: \
        break;\
    }\
  }\
/* call macro */
VLIB_INIT_PERSON(p)
int
main (int argc, char *argv[])
{
  p->type = MONKEY_TYPE;
  strcpy(p->m.name, "孙悟空");
  p->m.age = 12;

  print(p);

  p->type = DOG_TYPE;
  memcpy(p->d.name, "汪汪", sizeof(p->d.name));
  p->m.age = 12;

  print(p);

  return 0;
}

标签:__,name,GNU,union,age,创建对象,person,type,void
From: https://www.cnblogs.com/nanfengnan/p/16860225.html

相关文章

  • 创建对象,属性操作
    创建对象letobj={};letobj=newObject();letobj=Object.create(null);//不能不传值,null表示空值letobj=Object.assign(obj1,obj2,obj3);//**操作obj1......
  • L - Intersection and Union Gym - 103993L (线段树)
    题意思路思路很巧妙,首先是枚举每个值的贡献,然后找到了规律,下次做题的时候线分析每个题有啥好规律,然后根据规律做题。再就是线段树的这个思路,感觉很巧妙,通过设置每一段的......
  • 创建对象的五种方式
    创建对象的五种方式Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码:创建对象方法是否调用构造函数使用new关键字}→调用了构造函数使用Class类的newInstanc......
  • C语言--共用体(联合体)union
    共用体: 多个变量(不同的数据类型)共用同一块内存空间,但是同一时刻,只能有一个变量起作用共用体中起作用的的成员是最后一次存放的成员  #include<stdio.h>#inclu......
  • String基础: String两种创建对象方式的比较
    字符串常量在一般的语言中常量一旦声明则不可改变,在java中的字符串常量是以匿名对象来表示的javaz中字符串两种定义方法:StringstrA=newString("hello");(符合习惯......
  • SQL的inner join、left join、right join、full outer join、union、union&n
    假设有两张表,TableA是左边的表,TableB是右边的表1、INNERJOINSELECT*FROMTableAINNERJOINTableBONTableA.name=TableB.name INNERJOIN产生的结果集是......
  • 算法的 union-find 实践
    目录union-find接口quick-findquick-unionweighted-quick-unionpath-compressed-weighted-quick-unionheight-quick-union论证测试union-find各种算法的实现,\(N\)为结点......
  • 4.IOC创建对象的方式
    4.IOC创建对象的方式  配置beans.xml(基于XML的配置元数据的基本结构:)<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="<http://www.springframework.org/sc......
  • 创建对象内存分析
     测试代码packagecom.oop.demo2;publicclassApplication{publicstaticvoidmain(String[]args){Petdog=newPet();//当代码输出这一行时,name=nul......
  • Java知识5 创建对象 实例化 构造方法【多测师】
    一、创建对象对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:声明:声明一个对象,包括对象名称和对象类型。实例化:使用关键字new来创建一......