Advertisement
alexeyshmalko

WITH_RESOURCES

Sep 20th, 2015
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.17 KB | None | 0 0
  1. typedef struct {
  2.     int *a;
  3.     int *b;
  4. } my_struct;
  5.  
  6. my_struct *my_struct_init() {
  7.     WITH_RESOURCES(
  8.         my_struct *m;
  9.         // WITH_SIZED_MALLOC(m ) это примерно m = malloc(sizeof(*m))
  10.         WITH_SIZED_MALLOC(m );
  11.        
  12.         WITH_SIZED_MALLOC(m->a);
  13.         WITH_MALLOC(m->b, 32 * sizeof(int));
  14.         return m;
  15.     );
  16.     return NULL;
  17. }
  18.  
  19. int main(void) {
  20.     WITH_RESOURCES(
  21.         FILE *in;
  22.         WITH_FILE(in, "1.txt", "r");
  23.         FILE *out;
  24.         WITH_FILE(out, "2.txt", "w");
  25.  
  26.         char c[128];
  27.         printf("reading... ");
  28.         size_t s = fread(c, 1, 128, in);
  29.         printf("%zu\n", s);
  30.  
  31.         size_t s2 = fwrite(c, 1, s, out);
  32.         ENSURE(s == s2);
  33.  
  34.         printf("Successfully written all %zu bytes\n", s);
  35.     );
  36.     return 0;
  37. }
  38.  
  39. // Еще внутри WITH_RESOURCES работает break;
  40. // Он выходит из блока без очистки ресурсов.
  41.  
  42. // Еще есть ADD_CLEANUP. my_struct_init можно было бы написать так:
  43. my_struct *my_struct_init() {
  44.     WITH_RESOURCES(
  45.         ADD_CLEANUP(
  46.             printf("allocation error!\n");
  47.             return NULL;
  48.         );
  49.  
  50.         my_struct *m;
  51.         WITH_SIZED_MALLOC(m );
  52.        
  53.         WITH_SIZED_MALLOC(m->a);
  54.         WITH_MALLOC(m->b, 32 * sizeof(int));
  55.         return m;
  56.     );
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement