可以用宏抽象这个逻辑吗?

发布于 2024-09-14 20:36:16 字数 533 浏览 6 评论 0原文

我有数千个函数包装器,它们内部实际上执行类似的逻辑,例如:

// a, b, ... are variable length parameters of different type

void API_Wrapper(hHandle, a, b, ..)
{
if (hHandle)
   return remote_API(hHandle, a, b, ..);
else
   return API(a, b, ..);
}

我想使用宏来重用 if-else 逻辑,这样我就可以简单地实现这样的函数:

void API_Wrapper(hHandle, a, b, ..)
{
    API_CALL(api_name, hHandle, a, b, ..); // API_CALL is a macro
}

我没有想出一个好方法。 (注意:我可以通过...和__va_args__解决它,但我们当前使用的编译器不支持此扩展)

有人遇到过同样的问题和任何想法吗?

I have thousands of function wrappers which inside actually perform a similar logic like:

// a, b, ... are variable length parameters of different type

void API_Wrapper(hHandle, a, b, ..)
{
if (hHandle)
   return remote_API(hHandle, a, b, ..);
else
   return API(a, b, ..);
}

I want to use a macro to reuse the if-else logic so I can simply implement the function like this:

void API_Wrapper(hHandle, a, b, ..)
{
    API_CALL(api_name, hHandle, a, b, ..); // API_CALL is a macro
}

I didn't come up with a good way. (Note: I could solve it via ... and __va_args__ but this extension is not supported by the compiler we currently use)

Anyone ever met the same problem and any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

秉烛思 2024-09-21 20:36:16

另一个技巧,没有可变参数宏:

#define API_CALL(hHandle, api_name, arguments) if (hHandle) return remote_##api_name arguments; else return api_name arguments;

void API_Wrapper(int hHandle, int a, double b, char c)
{
            API_CALL(hHandle, api_name, (a, b, c));
}

变成:

void API_Wrapper(int hHandle, int a, double b, char c)
{
     if (hHandle) return remote_api_name (a, b, c); else return api_name (a, b, c);;
}

Another trick, without variadic macro's:

#define API_CALL(hHandle, api_name, arguments) if (hHandle) return remote_##api_name arguments; else return api_name arguments;

void API_Wrapper(int hHandle, int a, double b, char c)
{
            API_CALL(hHandle, api_name, (a, b, c));
}

Which becomes:

void API_Wrapper(int hHandle, int a, double b, char c)
{
     if (hHandle) return remote_api_name (a, b, c); else return api_name (a, b, c);;
}
给我一枪 2024-09-21 20:36:16

定义单独的 API_CALL0、API_CALL1 等:)
顺便说一句,您可能想研究一些能够自动化整个 API_Wrapper 的东西

define separate API_CALL0, API_CALL1 etc:)
You may wanna look into something that will automate the whole API_Wrapper thing, btw

束缚m 2024-09-21 20:36:16
#define API_CALL(api_name, hHandle, ...) if (hHandle) remote##api_name(hHandle, __VA_ARGS__); else api_name(hHandle, __VA_ARGS__);

void API_Wrapper(int hHandle, int a, double b, char c)
{
            API_CALL(api_name, hHandle, a, b, c);
}

这变成了

void API_Wrapper(int hHandle, int a, double b, char c)
{
     if (hHandle) remoteapi_name(hHandle, a, b, c); else api_name(hHandle, a, b, c);;
}
#define API_CALL(api_name, hHandle, ...) if (hHandle) remote##api_name(hHandle, __VA_ARGS__); else api_name(hHandle, __VA_ARGS__);

void API_Wrapper(int hHandle, int a, double b, char c)
{
            API_CALL(api_name, hHandle, a, b, c);
}

Which becomes

void API_Wrapper(int hHandle, int a, double b, char c)
{
     if (hHandle) remoteapi_name(hHandle, a, b, c); else api_name(hHandle, a, b, c);;
}
世态炎凉 2024-09-21 20:36:16

使用 BOOST_PP_SEQ_XXXX 你可以用类似于这样的方式编写包装器表:

WRAP_API(myfunc1, param(int, k) param(double, r) param(char*, s))
                               ^                ^
                               ^blank           ^blank

WRAP_API(myfunc2, param(int, k) )

....

如果没有可变参数宏,你可以使用空格分隔的列表,该列表被视为单个宏参数+一些封装在 boost pp 中的预处理器技术

Using BOOST_PP_SEQ_XXXX you can write your wrapper table in a way similar to this:

WRAP_API(myfunc1, param(int, k) param(double, r) param(char*, s))
                               ^                ^
                               ^blank           ^blank

WRAP_API(myfunc2, param(int, k) )

....

without variadic macros you can use space separated list which is treated as single macro parameter + some preprocessor techics incapsulated in boost pp

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文