7 Eylül 2016 Çarşamba

Gcc Labels As Values

Giriş
Gcc Labels As Values veya Computed gotos olarak bilir. Gcc'nin sağladığı ek bir özelliktir.

Tanımlama
Computed gotos şöyle tanımlanır.
static void *arr[1]  = {&& varOne,&& varTwo,&& varThree};

varOne: printf("One") ; goto *VarTwo;varTwo: printf("Two") ; goto *VarThree;varThree: printf("Three");
State Machine
Şöyle yaparız.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    void *tab[] = { &&foo, &&bar, &&qux };

    // Alternative method
    //int otab[] = { &&foo - &&foo, &&bar - &&foo, &&qux - &&foo };

    int i, state = 0;

    srand(time(NULL));

    for (i = 0; i < 10; ++i)
    {
        goto *tab[state];

        //goto *(&&foo + otab[state]);

    foo:
        printf("Foo\n");
        state = 2;
        continue;
    bar:
        printf("Bar\n");
        state = 0;
        continue;
    qux:
        printf("Qux\n");
        state = rand() % 3;
        continue;
    }
}
Çıktı olarak şunu alırız.
$ gcc -o x x.c && ./x
Foo
Qux
Foo
Qux
Bar
Foo
Qux
Qux
Bar
Foo

Hiç yorum yok:

Yorum Gönder