Сложный макрос с несколькими аргументами #define для строк - PullRequest
0 голосов
/ 24 октября 2011

Я работаю над проектом, и у меня есть проблема, которую, я считаю, можно решить с помощью макросов, но, учитывая природу проблемы, у меня нет опыта, чтобы написать ее самостоятельно.

Вот что я ожидал бы в качестве ввода и вывода макроса #define:

Ввод кода, такого как этот

printf(foobar(Hello World.));

Должно привести к тому, что препроцессор выдаст код:

printf((char *)(std::string("")+'H'+'e'+'l'+'l'+'o'+' '+'W'+'o'+'r'+'l'+'d'+'.').c_str());

Я предполагаю, что нечто сложное возможно, и я надеюсь, что один из вас, ребята, сможет мне помочь.

Мне нужно, чтобы он был макросом, я нигде не хочу строковую константу.

Ответы [ 5 ]

2 голосов
/ 24 октября 2011

Единственное решение, которое я могу придумать, - это запустить ваш код с помощью подходящего скрипта (возможно, просто небольшого количества awk ), который выполняет подстановку до того, как ваш код достигнет прекомпилятора.

В зависимости от вашей среды вы можете сделать это как «событие перед сборкой» в Visual Studio или просто добавить шаг прямо в ваш make-файл.

2 голосов
/ 24 октября 2011

Я боюсь, что это невозможно (если я чего-то не знаю). Я считаю, что нет макроса для разбиения данного входного токена (например, Hello) на символы, строящие его (H e l l o)

Были некоторые попытки сделать такую ​​вещь, но, боюсь, это не совсем то, что вам нужно:

C ++: Может ли макрос расширять «abc» до «a», «b», «c»?


«Более мощный прекомпилятор»?

Попробуйте эту тему: Замены для препроцессора C

1 голос
/ 24 октября 2011

Поскольку вы ищете узкий, прямой ответ на свой вопрос и без предложений, вот так:

Это невозможно.Вы должны найти другое решение для всего, что вы пытаетесь достичь.

1 голос
/ 24 октября 2011

Макросы - это, в основном, замена или добавление строк.Вы можете сделать это с вашим собственным препроцессором, но стандартный препроцессор не будет разбивать строки на составные части.макросы 'в отдельном файле.Написать программу, которая переведет их в нужное вам расширение, а затем включить этот файл в вашу программу c?Затем вы можете сделать программу расширения частью вашего make-файла, чтобы она всегда была актуальной.Использование отдельного файла значительно упрощает программу расширения, чем анализ файла ac / c ++.

0 голосов
/ 24 октября 2011

Вы пробовали:

#define toString(x) #x

Вы можете использовать его после этого:

printf("%s", toString(hello world));

Не пытайтесь использовать printf напрямую со строкой, потому что вы можете иметь спецификатор форматав строке.

printf(toString(hello world)); //wrong, you can have for example %d in the string
...