- 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
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUMARGS(type,...) (sizeof((type[]){__VA_ARGS__})/sizeof(type))
#define xDEF(type) typedef struct {size_t size; type* arr; } xARR(type)
#define xARR(type) jArr_ ## type
#define A(type, ...) (xARR(type)) {NUMARGS(type,__VA_ARGS__), (type[]){__VA_ARGS__}}
#define _FOR(type, item, Arr) type item=Arr.arr[0]; for(size_t I = 0; I < Arr.size; item=Arr.arr[++I] )
// MSVC
#define xFOR(type, item, array) do{ _FOR(type, item, array) {
// GCC, Clang
#define FOR(item, array) do{ __auto_type Arr=array; _FOR(__auto_type, item, Arr) {
#define NEXT }} while(0);
#define OfArray(type,arr) (xARR(type)){sizeof(arr)/sizeof(type), arr }
typedef struct {
char *name;
int id;
} Entry;
typedef struct {const char *name;} Str;
typedef struct {int x[2]; } Pair;
xDEF(Entry);
xDEF(Str);
xDEF(Pair);
xDEF(int);
void printEntry(xARR(Entry) entries)
{
xFOR(Entry, e, entries)
printf("%s %d \n", e.name, e.id);
NEXT
}
void printSquares(xARR(int) ints)
{
FOR(v, ints)
printf("%d²=%d\n", v,(int) pow(v,2.));
NEXT
}
int main(void)
{
xARR(Entry) e = A(Entry, {"one",1}, {"two",2}, {"three",3});
printEntry(e);
puts("_______________________________________");
// можно передавать в метод непосредственно аргуметом
printSquares( A(int, 3, 7, 5, 4) );
puts("_______________________________________");
int nums[]={4,3,2,1};
// можно использовать ранее объявленный массив
printSquares(OfArray(int,nums));
// можно итерироватьcя по ранее объявленному массиву
FOR(i, OfArray(int, nums))
printf("%d-",i);
NEXT
puts("\n_______________________________________");
//вложенные циклы:
for (int k=1;k<3;k++)
FOR(i, A(Str, "kakoi", "bagor"))
FOR(j, A(int, 1111,2222,3333))
printf("%d %s %d\n", k, i.name, j);
NEXT
NEXT
puts("_______________________________________");
FOR(v, A(Pair, {1,2}, {11,12}, {20,21}))
printf("%d,%d\n", v.x[0], v.x[1]);
NEXT
puts("_______________________________________");
//проблема пустого варарга
FOR(j, A(int))
printf("%d\n", j);
NEXT
return(0);
}