删除c中双引号的宏

发布于 2024-12-05 06:06:07 字数 435 浏览 0 评论 0原文

是否有任何宏可以删除字符串中的双引号和“\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__);
}

Is there any macro which will remove double quotes and '\0' in a string?

For example:-
"HELLO\0" -> HELLO

Edited:-
Actually I want to get the function address. So I thought to use FUNC Macro to get the function name and stipping out double quotes and '\0' will help me to get the function address.

for ex:

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

To avoid user define macros. I like to know other methods to derive these functionality :).

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

煮酒 2024-12-12 06:06:07

反过来做。

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

Do it the other way around.

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

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

Inside a macro, if x is a macro argument, then #x is the string version.

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

Typically, if you use this a lot, then you'll want to define a helper function to work around the weak type system in C:

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

Note that this won't work for getting the address of the current function. __FUNC__ is not a macro and it is not a string literal, it has no double quotes. You cannot use __FUNC__ to get the address of the function without some serious trickery, and it will break half the time. For example:

#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);
}

However, this will not work half the time -- dlsym wasn't designed to be used for that purpose.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文