C++宏时间算术

C++ macro time arithmetic

我正在开发一个 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

类似于首先你要实现操作:

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 库。