#include "stdafx.h" #define CO_YIELD(N) *state = N; return true; Label##N: state; #define COROTINE_1 if (*state == 1) goto Label1; #define COROTINE_2 COROTINE_1 else if (*state == 2) goto Label2; #define COROTINE_3 COROTINE_2 else if (*state == 3) goto Label3; #define COROTINE_4 COROTINE_3 else if (*state == 4) goto Label4; bool get_values(int *result, int *state) { COROTINE_4 *result = 1; CO_YIELD(1) *result = 2; CO_YIELD(2) *result = 3; CO_YIELD(3) *result = 4; CO_YIELD(4) return false; } bool even(unsigned int* number, int* state, size_t max) { COROTINE_1 for (*number = 2; *number < max; ++(*number)) { if (*number % 2 == 0) { CO_YIELD(1) } } return false; } int main() { int state = 0; int result; while (get_values(&result, &state)) { printf("%d ", result); } printf("\n"); state = 0; unsigned int number = 0; while (even(&number, &state, 30)) { printf("%d ", number); } return 0; }