Поскольку C не знает шаблонов, можно использовать препроцессор и некоторые (in?) Вменяемые макросы:
#include <stdlib.h>
#include <stdio.h>
#include <math.h> /* for M_PI */
#ifndef M_PI
# define M_PI (3.14159265359)
#endif
#define SMT_INIT(T, p, nb) do { \
(p) = malloc(nb * sizeof (T)); \
} while (0)
#define SMT(T, p, nb, stmt) do { \
for (size_t i = 0; i < (nb); ++i) \
{ \
((T*)(p))[i] = (T)(stmt); \
} \
} while (0)
#define SMT_PRINT(T, p, nb, fmt) do { \
for (size_t i = 0; i < (nb); ++i) \
{ \
printf("%" fmt "\n", ((T*)(p))[i]); \
} \
} while (0)
int main(void)
{
void * p = NULL;
int iform = ...;
size_t nb = ...;
int result = 0;
switch (iform)
{
case 1:
SMT_INIT(int, p, nb);
SMT(int, p, nb, i);
SMT_PRINT(int, p, nb, "d");
break;
case 2:
SMT_INIT(float, p, nb);
SMT(float, p, nb, 2.71);
SMT_PRINT(float, p, nb, "f");
break;
case 3:
SMT_INIT(double, p, nb);
SMT(double, p, nb, i * M_PI);
SMT_PRINT(double, p, nb, "f");
break;
case 4:
result = -1;
break;
}
free(p);
return 0 == result ?EXIT_SUCCESS :EXIT_FAILURE;
}
Представление другого макроса, оборачивающего остальные три вещи, может быть запутано еще больше:
#define SMT_ALL(T, p, nb, stmt, fmt) do { \
SMT_INIT(T, p, nb); \
SMT(T, p, nb, stmt); \
SMT_PRINT(T, p, nb, fmt); \
} while (0)
int main(void)
{
...
switch (iform)
{
case 1:
SMT_ALL(int, p, nb, i, "d");
break;
case 2:
SMT_ALL(float, p, nb, 2.71, "f");
break;
case 3:
SMT_ALL(double, p, nb, i * M_PI, "f");
break;
case 4:
result = -1;
break;
}
...
}