Препроцессор C передает несколько аргументов, как если бы они были единственным аргументом. Я уверен, что проблема заключается в том, как мы вызываем макрос untouchable
, но каждая попытка, которую мы сделали для изменения макроса first
, не привела к желаемому результату. Вот полный образец кода с комментариями, которые объясняют, что происходит и что мы хотим:
//this can be changed, but it must remain a #define to be of any use to us
#define first a,b,c
// v all code below this line cannot be altered (it outside of our control)
#define untouchable(name, c1, c2, c3) \
wchar_t name[] = \
{ \
quote(c1), \
quote(c2), \
quote(c3) \
}
#define quote(c) L#@c
// ^ all code above this line cannot be altered (it outside of our control)
int _tmain(int argc, _TCHAR* argv[])
{
static untouchable(mrNess, first);
// the line above is precompiled to:
// static wchar_t mrNess[] = { L'a,b,c', L, L };
// whereas we want:
// static wchar_t mrNess[] = { L'a', L'b', L'c' };
return 0;
}
Мы компилируем в Windows под VisualStudio.