Я хотел бы добавить некоторые условные директивы в моем коде, чтобы контролировать другую сборку, например:Существуют ли директивы в препроцессоре C/C++ для преобразования строки в число?
#if VERSION > 100
/* Compiling here */
#endif
Проблема заключается в том, что «версия» в коде другой, где я не могу изменить. Она была определена как строка:
#define VERSION "101"
Я интересно, если есть какой-то макрос или директива, которая преобразует строку в номер, так что я могу просто сделать
#if STRING_TO_NUMBER(VERSION) > 100
/* Compiling here */
#endif
Это возможно, пожалуйста?
PS. Кажется, мое описание не совсем понятно. Основная цель этого требования - контролировать ветвь версии. Например, в старой версии, pre-version 100, эта программа хотела бы old_function(). После этой версии все функции были перенесены в new_function. Поэтому мне нужно написать такие коды:
#if VERSION >= 100
old_function();
#else
new_function();
#endif
#if VERSION >= 100
int old_function()
{
...
}
#else
int new_function()
{
...
}
#endif
Вы можете видеть, что будет скомпилирована только одна из функций. Поэтому условие должно быть определено на стадии предварительной обработки, а не во время выполнения.
Сложная часть, VERSION была определена как строка, которая вызвала этот вопрос.
Должен ли быть получен результат на этапе предварительной обработки? Или вы можете использовать функцию 'inline' или' macro'? –
Слишком плохо, что они сделали макрос строкой - легко получить строку из значения макроса (используя оператор '#' 'stringize'), но не так просто, насколько мне известно, не так. –
Вместо этого может быть использован мета-программирование шаблонов. По существу, вызывая или создавая экземпляр другого класса шаблонов на основе версии. вам нужно будет создать тип, основанный на строке VERSION. – Rob