/Надевает Индиана Jones` шляпу/
Я могу быть немного слишком поздно, но я должен сказать, что эта проблема имеет правильное (-иш) решение.
Во-первых, некоторые предварительные определяет (explanation here):
#define L(c, ...) \
L4(c,1,0,,,,,,,,,,,,,##__VA_ARGS__) L4(c,0,1,,,,,,,,,##__VA_ARGS__) \
L4(c,0,2,,,,, ##__VA_ARGS__) L4(c,0,3, ##__VA_ARGS__)
#define L4(c, f, n, ...) \
L3(c,f,n##0,,,,__VA_ARGS__) L3(c,0,n##1,,,__VA_ARGS__) \
L3(c,0,n##2,, __VA_ARGS__) L3(c,0,n##3, __VA_ARGS__)
#define L3(...) L2(__VA_ARGS__, \
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,)
#define L2(c, f, \
n00,n01,n02,n03, n04,n05,n06,n07, n08,n09,n0A,n0B, n0C,n0D,n0E,n0F, \
a00,a01,a02,a03, a04,a05,a06,a07, a08,a09,a0A,a0B, a0C,a0D,a0E,a0F, \
s, ...) L##s(c, f, n00, a00)
#define L1(c, f, n, a) c##f(n, a)
#define L0(c, f, n, a)
Затем код, который на самом деле является продолжением @ alk`s ответа:
#include <stdio.h>
#define STRING1(n, a) #a, (a)
#define STRING0(n, a) , STRING1(n, a)
#define PRINTF(fmt, ...) printf(fmt, L(STRING, __VA_ARGS__))
int main(int argc, char *argv[]) {
int i = 42;
char ch = 'a';
char str[4] = "alk";
/** every var must be preceded with '%s' for its name to be shown **/
PRINTF("%s=%s, %s=%c, %s=%d\n", str, ch, i);
return 0;
}
Эта версия подходит только для [ 0..16], но его можно легко распространить на любой аргумент count, особенно на степени 2. Однако, чем больше аргументов он поддерживает, тем менее элегантным он выглядит.
P.S .: @BasileStarynkevitch уже предоставил все правильные ссылки, чтобы выяснить, как это работает.
для char print are% c и не% s Я обновил вопрос с этим – MOHAMED
Я уверен, что это невозможно. – JeremyP
К OP: вы уверены, что хотите * точно * что? Это нелегко сделать! (Но если вы проводите несколько дней или недель работы, вы можете получить что-то близкое). –