- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#define STRING 0
#define INTEGER 1
#define CAT(x,y) x ## _ ## y
#define J(x,y) CAT(x,y)
typedef union
{
char *J(v, STRING);
int J(v,INTEGER);
} Un;
typedef struct
{
uint8_t Obj_t;
Un u;
} Object;
#define IF_INSTOF(var, t, newvar) \
if(var.Obj_t == t) \
{ \
typeof(var.u.J(v,t)) *newvar = &var.u.J(v,t);
int main(void)
{
Object obj1 = {STRING, {.J(v,STRING) = "1"}};
IF_INSTOF(obj1,STRING,str)
printf("String: %s\n", *str);
}
else
{
printf("Not a string\n");
}
Object obj2 = {INTEGER, {.J(v,INTEGER) = 1}};
IF_INSTOF(obj2,INTEGER,i)
printf("Integer: %d\n", *i);
}
else
{
printf("Not an Integer\n");
}
return EXIT_SUCCESS;
}
Вот такие смарткасты через препроцессор.
https://govnokod.ru/27556#comment655527