是否有任何宏会删除双引号和字符串中的'\ 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__);
}
答案 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
并非旨在用于此目的。