Как я могу сгенерировать определение препроцессора, используя арифметику?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу сгенерировать определение препроцессора, используя арифметику?

Сообщение Anonymous »

Я хочу динамически создавать литеральные строки препроцессора, в которых часть строки создается с помощью некоторой арифметики, например: math(x) x - 0x1234. Сгенерированные определения будут созданы макросом: get_tex_uniform_name(unit), а результаты будут теми же значениями, что и следующие определения в числовом порядке:

Код: Выделить всё

// Texture uniform naming
#define TEX_UNIFORM_BASE_NAME        "tex"
#define TEX_UNIFORM_0                TEX_UNIFORM_BASE_NAME"0"  // "tex0" and so on
#define TEX_UNIFORM_1                TEX_UNIFORM_BASE_NAME"1"
#define TEX_UNIFORM_2                TEX_UNIFORM_BASE_NAME"2"
#define TEX_UNIFORM_3                TEX_UNIFORM_BASE_NAME"3"
Я попробовал сгенерировать строку с нуля с помощью STRINGIFY (#):

Код: Выделить всё

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
// create string literal from whatever is put in
#define STRINGIFY(x) #x
#define LITERAL_STRINGIFY(x) STRINGIFY(x)
#define get_tex_uniform_name(unit) TEX_UNIFORM_BASE_NAME LITERAL_STRINGIFY(get_tex_unit_num(unit))

// Issue: result is "texunit - 0x84C0", 0x84C0 being GL_TEXTURE0
Я попробовал вставку токенов для работы с существующими определениями:

Код: Выделить всё

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
#define get_tex_uniform_name(unit) TEX_UNIFORM_ ## get_tex_unit_num(unit)

// Error: TEX_UNIFORM_get_tex_unit_num is undefined
И пытались заставить работать какую-то битовую маскировку:

Код: Выделить всё

#define TEX_UNIFORM_BASE_NAME        "tex "

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
#define get_tex_uniform_name(unit) TEX_UNIFORM_BASE_NAME & (0xffffff00 + (char)get_tex_unit_num(unit))

// Error: expression must have integral or unscoped enum type
Я знаю, что это можно сделать с помощью функций или просто используя объединенные литеральные строки, как определено в первом примере. Я не обязательно ищу причину, по которой мои примеры не работают. Я ищу способ динамического получения этих строк, и у меня возникли проблемы с использованием арифметических операций внутри макросов для создания строкового литерала.


Подробнее здесь: https://stackoverflow.com/questions/558 ... arithmetic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»