Похоже, что этот вопрос не имеет определенного закрытого ответа, поэтому я приведу лишь пару примеров.
Предположим, вы хотите напечатать информацию о данном типе.Имена типов не существуют в скомпилированном коде, поэтому они не могут быть выражены самим языком (за исключением расширений C ++).Здесь препроцессор должен вмешаться:
#define PRINT_TYPE_INFO(type) do { printf("sizeof(" #type ") = %zu\n", sizeof(type)); } while (false)
PRINT_TYPE_INFO(int);
PRINT_TYPE_INFO(double);
Аналогично, имена функций сами по себе не являются переменными, поэтому, если вам нужно сгенерировать множество похожих имен, препроцессор помогает:
#define DECLARE_SYM(name) fhandle libfoo_##name = dlsym("foo_" #name, lib);
DECLARE_SYM(init); // looks up "foo_init()", declares "libfoo_init" pointer
DECLARE_SYM(free);
DECLARE_SYM(get);
DECLARE_SYM(set);
Myлюбимое использование для отправки вызовов функций CUDA и проверки их возвращаемого значения:
#define CUDACALL(F, ARGS...) do { e = F(ARGS); if (e != cudaSuccess) throw cudaException(#F, e); } while (false)
CUDACALL(cudaMemcpy, data, dp, s, cudaMemcpyDeviceToHost);
CUDACALL(cudaFree, dp);