Преобразование постоянного числа #defined в строку

У меня определена константа:

#define MAX_STR_LEN 100

Я пытаюсь сделать это:

scanf("%" MAX_STR_LEN "s", p_buf);

Но, конечно, это не работает.

Какой трюк препроцессора можно использовать для преобразования числа MAX_STR_LEN в строку, чтобы я мог использовать его в приведенном выше вызове scanf? В основном:

scanf("%" XYZ(MAX_STR_LEN) "s", p_buf);

Каким должен быть XYZ()?

Примечание. Я, конечно, могу сделать «% 100s» напрямую, но это противоречит цели. Я также могу сделать #define MAX_STR_LEN_STR "100", но я надеюсь на более элегантное решение.


person Sid Datta    schedule 29.09.2012    source источник
comment
#define f(x) #x будет препроцессировать f(foo) в "foo"   -  person Andrew Tomazos    schedule 29.09.2012
comment
Возможно, вы захотите посмотреть мой ответ на странице stackoverflow.com/questions. /5256313/   -  person Jim Balter    schedule 29.09.2012


Ответы (1)


Используйте оператор предварительной обработки #. Этот оператор работает только во время расширения макроса, поэтому вам понадобятся некоторые макросы, чтобы помочь. Далее, из-за особенностей, присущих алгоритму замены макросов, нужен слой косвенности. Результат выглядит следующим образом:

#define STRINGIZE_(x) #x
#define STRINGIZE(x) STRINGIZE_(x)

scanf("%" STRINGIZE(MAX_STR_LEN) "s", p_buf);
person James McNellis    schedule 29.09.2012