Где функция convert()?
Про сравнение строк вам уже ответили.
Но у вас еще в printf полная фигня. Вы ей передаете void* при этом в шаблоне у вас int и double. Нужно делать преобразование и разыменование:
if (type == "int"){
printf("%d", *((int*)d));
} else if (type == "float"){
printf("%lf", *((double*)d));
Ну и вместо строк "int, "float", ... лучше использовать какие-либо целочисленные константы - их то можно сравнивать напрямую.
На Си вашу затею так же красиво как в плюсах не реализовать. Для каждого типа данных нужна своя функция convert с уникальным именем (converti(int), convertd(double), ...).
В макросе нет возможности автоматически узнать какой тип данных ему передан, поэтому ваш код не откомпилируется.
Необходимо явно указывать какую функцию для вывода вызывать (или явно указывать какой тип данных в нее передается).
Например имеем набор функций для вывода соответствующего типа данных:
void putsi(int);
void putsd(double);
void putss(const char *);
#define PUTS(t, val) puts ## t(val)
int main()
{
PUTS(i, 123);
PUTS(d, 3.14);
PUTS(s, "hello world!");
return 0;
}