Я работаю над загрузчиком wgl и определяю каждую функцию openGL, которую я использую, вот так:

/*Let's say I'm defining n functions*/ 
typedef return_t (*f1)(params)
f1 _glFunc1;
#define glFunc1(params) _glFunc1(params)
...
typedef return_t (*fn)(params)
fn _glFuncn;
#define glFuncn(params) _glFuncn(params)

Затем, чтобы получить определения этих функций, я должен использовать wglGetProcAddress или GetProcAddress, а затем привести результат к f1, f2 ... Я попытался автоматизировать приведение с помощью этого макроса:

#define GetFuncDef(glFunc) _##glFunc = (f##(__LINE__ - startingLineNumber + 1))GetProcAddress(#glFunc)

Где startingLineNumber - первая строка, в которой я использую этот макрос (в моем случае это 22), но препроцессор не вычисляет __LINE__ - startingLineNumber.

Есть ли способ заставить его это сделать?

РЕДАКТИРОВАТЬ: startingLineNumber не является переменной, макросом и т. Д. Он записан в моем коде как буквальное число. нравится: #define GetFuncDef(glFunc) _##glFunc = (f##(__LINE__ - 22 + 1))GetProcAddress(#glFunc), где 22 будет startingLineNumber

1
Phillip 27 Ноя 2021 в 16:25
Что такое startingLineNumber? Не могли бы вы привести пример?
 – 
KamilCuk
27 Ноя 2021 в 16:29
Для целей вопроса просто предположите, что это число вроде 12.
 – 
Phillip
27 Ноя 2021 в 16:32
1
«число вроде 12» не указывает тип элемента языка C или C ++, который startingLineNumber is .
 – 
Andrew Henle
27 Ноя 2021 в 16:34
1
Выполняет ли stackoverflow.com/questions / 69810889 /… ответьте на ваш вопрос? Это для DIV, но механизмы вычитания те же. || Не могли бы вы создать полный компилируемый минимально воспроизводимый пример?
 – 
KamilCuk
27 Ноя 2021 в 16:42
1
Не помечайте C для вопросов C ++.
 – 
Eric Postpischil
27 Ноя 2021 в 16:44

1 ответ

Лучший ответ

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

typedef return_t (*f1)(params)
typedef return_t (*f2)(params)
void *GetProcAddress(charr *);

#define SUB_10_0   10
#define SUB_10_1   9
#define SUB_10_2   8
// etc. for each each possible combination, 1000 of lines ...
#define SUB_21_20  1
// etc. for each each possible combination, 1000 of lines ...
#define SUB_IN(a, b)  SUB_##a##_##b
#define SUB(a, b)  SUB_IN(a, b)


#define CONCAT_IN(a, b)  a##b
#define CONCAT(a, b)     CONCAT_IN(a, b)

#define startingLineNumber 20
#define GetFuncDef(glFunc) (CONCAT(f, SUB(__LINE__, startingLineNumber)))GetProcAddress(#glFunc)
int main() {
    f1 a = GetFuncDef();
}

Затем gcc -E выводит:

typedef return_t (*f1)(params)
typedef return_t (*f2)(params)
void *GetProcAddress(charr *);
int main() {
    f1 a = (f1)GetProcAddress("");
}

Подобным образом упомянутые здесь библиотеки Boost и P99 могут быть использовал.

1
KamilCuk 27 Ноя 2021 в 16:48