C宏将函数名与预定义的名称列表进行比较

C宏将函数名与预定义的名称列表进行比较,c,visual-studio,macros,precompile,C,Visual Studio,Macros,Precompile,我在windows上挂接了一些函数(大约200个),我想在所有这些函数中添加一些通用功能。根据我给我的应用程序的一个标志,钩住或不钩住一些预定义的函数 我的想法是这样的: #define SHOULD_CHECK_STOP_MONITOR (1 == Configuration.dwShouldMonitor) #define MY_CHECK_MACRO(f) (if(SHOULD_CHECK_STOP_MONITOR && /* What do I do

我在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\u A”、“MyHookedFunctionName\u C”、“MyHookedFunctionName\u D”]
宏将根据函数名知道是返回
False
还是
True
。因此,在本例中,
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
的情况下,许多编译器应该能够完全优化“运行时”检查

下面是一个简单的程序来说明这一点

#include <string.h>
#include <stdio.h>

static const char* func_list[] = { "foo", "bar" };

static inline int is_in_list(const char* f) {
    for (int i = 0; i < sizeof(func_list)/sizeof(func_list[0]); ++i)
        if (strcmp(f, func_list[i]) == 0)
            return 1;
    return 0;
}

#define HOOKME if (SHOULD_HOOK && is_in_list(__func__)) return;

void foo() {
    HOOKME;
    printf("foo\n");
}
void bar() {
    HOOKME;
    printf("bar\n");
}
void baz() {
    HOOKME;
    printf("baz\n");
}

int main()
{
    foo();
    bar();
    baz();
}

并非所有的编译器都能做到这一点。明智地选择你的工具

我认为用宏是不可能的。如果是C++,你可以使用<代码> CONTXPRP> /COD>函数…@ HOLYBLASCAT,C中没有替代的等价物吗?我唯一的选择是在运行时的每个函数内执行这个逻辑,我想不出,但是我可能错了。宏调用的结果是一个文本,通常是C或C++程序。您想要生成什么样的文本根本不清楚。您是否可以发布设置标志时希望生成的一些文本,以及未设置标志时希望从同一来源生成的一些文本?您不必在预处理之前发布源代码。这正是预处理后您希望看到的。嘿@n.m.,我添加了我期望的结果,基于函数字符串名称,我希望它能够方便地创建
True
False
语句,我可以轻松控制所有函数,如果不需要动态执行此逻辑,就像我正在寻找的那样,无法真正使其工作,但是,您知道它是否应该与Microsoft Visual Studio 2015编译器一起工作吗?@0xAK此特定代码不工作(即MSC不会对其进行优化)。
foo:
  ret
bar:
  ret
.LC0:
  .string "baz"
baz:
  mov edi, OFFSET FLAT:.LC0
  jmp puts
main:
  sub rsp, 8
  xor eax, eax
  call baz
  xor eax, eax
  add rsp, 8
  ret