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 库。
我正在开发一个 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("");
}
以类似的方式提到