宏删除c中的双引号

时间:2011-09-19 15:41:50

标签: c macros

是否有任何宏会删除双引号和字符串中的'\ 0'?

例如: - “HELLO \ 0” - > HELLO

编辑: - 其实我想得到功能地址。所以我想用 FUNC 宏来获取函数名称并加上双引号,'\ 0'将帮助我获取函数地址。

代表:

#define FUN_PTR fun
#define FUN_NAME "fun"
void fun(){
 printf("fun add %p name %s\n",FUN_PTR,FUN_NAME);
}

避免用户定义宏。我想知道推导这些功能的其他方法:)。

void fun(){
 printf("fun add %p name %s\n",<SOME_MACRO>(__FUNC__),__FUNC__);
}

1 个答案:

答案 0 :(得分:4)

反过来做。

#define PRINT_PTR(p) printf(#p " == %p\n", (void *) p)

int main()
{
    PRINT_PTR(exit);
    return 0;
}

在宏内部,如果x是一个宏参数,则#x是字符串版本。

#define PRINT_INT(i) printf(#i " == %d\n", i)
PRINT_INT(5 + ~3);
PRINT_INT(atoi("1234"));

通常情况下,如果你经常使用它,那么你需要定义一个辅助函数来解决C中的弱类型系统:

void print_ptr_func(char const *s, int v);
#define PRINT_PTR(p) print_ptr_func(#p, p)

请注意,这不适用于获取当前函数的地址。 __FUNC__不是宏,它不是字符串文字,它没有双引号。如果没有严重的诡计,你不能使用__FUNC__来获取函数的地址,并且会打破一半的时间。例如:

#define PRINT_FUNC_INFO() print_func_info(__FUNC__)

#include <dlfcn.h>
void print_func_info(char const *n)
{
    void *p = dlsym(RTLD_DEFAULT, n);
    printf("Function %s, address %p\n", n, p);
}

但是,这部分时间不会有效 - dlsym并非旨在用于此目的。

相关问题