Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
宏删除c中的双引号_C_Macros - Fatal编程技术网

宏删除c中的双引号

宏删除c中的双引号,c,macros,C,Macros,是否有任何宏将删除字符串中的双引号和“\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

是否有任何宏将删除字符串中的双引号和“\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(“有趣的添加%p名称%s\n”,(\uuu FUNC\uuuu),\uu FUNC\uuu);
}

反过来做

#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"));
通常,如果您经常使用它,那么您需要定义一个helper函数来处理C中的弱类型系统:

void print_ptr_func(char const *s, int v);
#define PRINT_PTR(p) print_ptr_func(#p, p)
请注意,这不适用于获取当前函数的地址<代码>\uuuu FUNC\uuuu不是宏,也不是字符串文字,它没有双引号。您不能使用
\uuuu FUNC\uuuu
获取函数的地址而不进行一些严重的欺骗,并且它会在一半时间内中断。例如:

#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);
}
#定义打印功能信息()打印功能信息
#包括
无效打印功能信息(字符常量*n)
{
void*p=dlsym(RTLD_默认值,n);
printf(“函数%s,地址%p\n”,n,p);
}

但是,这不会有一半的时间起作用--
dlsym
不是设计用于此目的的。

反过来做

#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"));
通常,如果您经常使用它,那么您需要定义一个helper函数来处理C中的弱类型系统:

void print_ptr_func(char const *s, int v);
#define PRINT_PTR(p) print_ptr_func(#p, p)
请注意,这不适用于获取当前函数的地址<代码>\uuuu FUNC\uuuu不是宏,也不是字符串文字,它没有双引号。您不能使用
\uuuu FUNC\uuuu
获取函数的地址而不进行一些严重的欺骗,并且它会在一半时间内中断。例如:

#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);
}
#定义打印功能信息()打印功能信息
#包括
无效打印功能信息(字符常量*n)
{
void*p=dlsym(RTLD_默认值,n);
printf(“函数%s,地址%p\n”,n,p);
}

但是,这在一半的时间内都不起作用--
dlsym
不是设计用于此目的的。

为什么?也许有另一种方法来做你想做的…好吧,你到底想做什么?似乎如果我们对问题领域有一个更大的概念,我们可以给出一个更好的答案。为什么?也许有另一种方法来做你想做的…好吧,你到底想做什么?似乎如果我们对问题领域有一个更大的概念,我们可以给出一个更好的答案。