
Unions are somewhat hard to implement in Go because they are not a native type. But it is actually possible with some compiler magic. This commit inserts a special "C union" field at the start of a struct to indicate that it is a union. As such a field cannot be written directly in Go, this is a useful to distinguish structs and unions.
41 строка
973 Б
C
41 строка
973 Б
C
typedef short myint;
|
|
int add(int a, int b);
|
|
typedef int (*binop_t) (int, int);
|
|
int doCallback(int a, int b, binop_t cb);
|
|
typedef int * intPointer;
|
|
void store(int value, int *ptr);
|
|
|
|
typedef struct collection {
|
|
short s;
|
|
long l;
|
|
float f;
|
|
unsigned char c;
|
|
} collection_t;
|
|
|
|
typedef union joined {
|
|
myint s;
|
|
float f;
|
|
short data[3];
|
|
} joined_t;
|
|
void unionSetShort(short s);
|
|
void unionSetFloat(float f);
|
|
void unionSetData(short f0, short f1, short f2);
|
|
|
|
// test globals
|
|
extern int global;
|
|
extern _Bool globalBool;
|
|
extern _Bool globalBool2;
|
|
extern float globalFloat;
|
|
extern double globalDouble;
|
|
extern _Complex float globalComplexFloat;
|
|
extern _Complex double globalComplexDouble;
|
|
extern _Complex double globalComplexLongDouble;
|
|
extern collection_t globalStruct;
|
|
extern int globalStructSize;
|
|
extern short globalArray[3];
|
|
extern joined_t globalUnion;
|
|
extern int globalUnionSize;
|
|
|
|
// test duplicate definitions
|
|
int add(int a, int b);
|
|
extern int global;
|