【发布时间】:2020-01-16 12:25:02
【问题描述】:
我有一些功能要挂在 Windows 上(大约 200 个),我想为所有这些功能添加一些通用功能。根据我给我的应用程序的标志,挂钩或不挂钩一些预定义的功能。
我的想法是这样的:
#define SHOULD_CHECK_STOP_MONITOR (1 == Configuration.dwShouldMonitor)
#define MY_CHECK_MACRO(f) (if(SHOULD_CHECK_STOP_MONITOR && /* What do I do here? */))
void MyHookedFunctionName_A(...)
{
if(!MY_CHECK_MACRO(__FUNCTION__))
goto lbl_Cleanup;
/* rest of code logic */
lbl_Cleanup:
return ...;
}
void MyHookedFunctionName_B(...)
{
if(!MY_CHECK_MACRO(__FUNCTION__))
goto lbl_Cleanup;
/* rest of code logic */
lbl_Cleanup:
return ...;
}
我想要实现的结果是一个预编译的逻辑,不是在动态运行时执行,而是在编译时执行。如果1 == Configuration.dwShouldMonitor 配置为True,它将检查其余逻辑,其中我将有某种预定义的函数名称列表["MyHookedFunctionName_A", "MyHookedFunctionName_C", "MyHookedFunctionName_D"],并且宏会知道是返回False 还是@ 987654326@ 基于函数名称。所以在这个例子中,MyHookedFunctionName_B 会执行,而MyHookedFunctionName_A 不会因为编译时的预定义列表。
这样的事情可能吗?对于基于函数名称的“复杂”逻辑并将其与预定义的字符串函数名称进行比较?
编辑 2019.09.15: 我在这里添加我希望预编译逻辑之后的结果
void MyHookedFunctionName_A(...)
{
if(!(1 == Configuration.dwShouldMonitor && False))
goto lbl_Cleanup;
...
}
void MyHookedFunctionName_B(...)
{
if(!(1 == Configuration.dwShouldMonitor && True))
goto lbl_Cleanup;
...
}
True 或 False 是在编译时根据函数字符串名称生成的
【问题讨论】:
-
我认为宏不可能。如果是 C++,你可以使用
constexpr函数... -
@HolyBlackCat ,C 中没有替代的等价物吗?我唯一的选择是在运行时的每个函数中执行这个逻辑?
-
我想不出来,但我可能是错的。
-
宏调用的结果是文本,通常是 C 或 C++ 程序的文本。完全不清楚您想要生成什么样的文本。您可以发布一些您希望在设置标志时生成的文本,以及一些您希望在未设置标志时从同一来源生成的文本吗?您不必在预处理之前发布源代码。正是您想在预处理后看到的。
-
嘿@nm,我添加了我期望的结果,基于函数字符串名称,我希望它可以方便地创建
True或False语句,我可以轻松控制所有我的功能,无需动态执行此逻辑
标签: c visual-studio macros precompile