fork download
  1. #include <stdio.h>
  2.  
  3. typedef struct Printer Printer;
  4.  
  5. struct Printer
  6. {
  7. void (*print_string)(char*);
  8. void (*print_int)(int);
  9. void (*print_double)(double);
  10. void (*print_endline)(void);
  11. };
  12.  
  13. /* предполагается, что эти функции реализованы в отдельном файле
  14.   и не видны, поэтому могут иметь какие угодно имена,
  15.   просто тут в Ideone нет поддержки нескольких файлов
  16.   */
  17. void Printf_print_string(char *s) { printf("%s", s); }
  18. void Printf_print_int(int i) { printf("%d", i); }
  19. void Printf_print_double(double d) { printf("%f", d); }
  20. void Printf_print_endline(void) { printf("\n"); }
  21.  
  22. const Printer Printf = {
  23. Printf_print_string,
  24. Printf_print_int,
  25. Printf_print_double,
  26. Printf_print_endline
  27. };
  28.  
  29. void Happy_print_string(char *s) { printf("%s ;-)", s); }
  30. void Happy_print_int(int i) { printf("%d =)", i); }
  31. void Happy_print_double(double d) { printf("%f B-]", d); }
  32. void Happy_print_endline(void) { printf("Bye! ^_^\n"); }
  33.  
  34. const Printer HappyPrinter = {
  35. Happy_print_string,
  36. Happy_print_int,
  37. Happy_print_double,
  38. Happy_print_endline
  39. };
  40.  
  41. void print_all(Printer *p, char *s, int i, double d)
  42. {
  43. p->print_string(s);
  44. Printf.print_string("\n\t");
  45. p->print_int(i);
  46. Printf.print_string("\n\t");
  47. p->print_double(d);
  48. Printf.print_string("\n\t");
  49. p->print_endline();
  50. Printf.print_string("\n");
  51. }
  52.  
  53. int main(void)
  54. {
  55. print_all(&Printf, "printf", 1, 2.3);
  56. print_all(&HappyPrinter, "Hello!", 1, 2.3);
  57. return 0;
  58. }
  59.  
Success #stdin #stdout 0s 2008KB
stdin
Standard input is empty
stdout
printf
	1
	2.300000
	

Hello! ;-)
	1 =)
	2.300000 B-]
	Bye! ^_^