【问题标题】:Macro to remove double quotes in c删除c中双引号的宏
【发布时间】:2011-09-19 15:41:50
【问题描述】:

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

例如:- “你好\0” -> 你好

编辑:- 其实我想得到函数地址。所以我想使用 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__);
}

【问题讨论】:

  • 为什么?也许还有另一种方法可以做你想做的事......
  • 好的,你到底想在这里做什么?似乎如果我们对问题域有更大的了解,我们可以给出更好的答案。

标签: c macros


【解决方案1】:

反过来做。

#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 并不是为此目的而设计的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2017-11-20
    • 2015-01-01
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多