获取传递给C中函数的变量名

voase2hg  于 2023-05-16  发布在  其他
关注(0)|答案(4)|浏览(152)

我正在写一个演示程序来打印变量的地址。为了使代码看起来更清晰,我创建了一个声明函数的头文件(ex.pointer.h)和一个用于调用该函数的C文件(ex.我想打印在main. c中调用的变量名的变量的地址
main.c:

#include "pointer.h"

int main(int argc, char *argv[]){
    int var=40;
    printAddress(var);
}

pointer.h

#include<stdio.h>
int *p;
#define getName(var) #var

void printAddress(int a){
    p=&a;
    printf("Address of variable %s is %p\n",getName(a),p);
}

我尝试使用宏,但它打印Address of variable a is 0x7fff2424407c,这不是预期的输出Address of variable var is 0x7fff2424407c。有没有人能告诉我应该做什么改变,请解释一下。

oxosxuxt

oxosxuxt1#

你不能像你展示的那样使用函数打印变量的地址。原因是a是局部变量,它的标识与传递给printAddress的变量的标识不同。
您也无法获取名称,因为该名称在该上下文中不存在。
但是,您可以使用宏:

#define printAddress(x)    printf("Address of variable %s is %p\n", #x, &x)

注意这里的#是预处理器的字符串化操作符;它将一个token转换为一个C字符串文字(实际上只是在token周围添加引号)。
完整示例:

#include <stdio.h>

#define printAddress(x)    printf("Address of variable %s is %p\n", #x, &x)

int main(void)
{
    int foo;
    printAddress(foo);
    return 0;
}
huwehgph

huwehgph2#

宏可以在将变量传递给实际函数之前准备变量的名称和地址。不要在生产代码中这样做:

#include <stdio.h>

void printAddress(char *name, void *address)
{
    printf("The address of %s is %p.\n", name, address);
}

#define printAddress(x) printAddress(#x, &(x))

int main(void)
{
    int var = 40;
    printAddress(var);
}
lrl1mhuk

lrl1mhuk3#

我尝试使用宏,但它打印变量a的地址是0x 7 fff 2424407 c,这不是变量var的预期outputAddress是0x 7 fff 2424407 c。
在调用getName的地方,变量名是a。没有办法追溯到你传递了一个之前被变量var引用过的值。这是因为,就编译器而言,您没有传递变量的“名称”,而是传递了它的值-在本例中是一个整数-为了使代码可读,它是printAddress函数体中的名称a
现在,实现你想要的唯一方法是摆脱函数,并将整个事情实现为宏。
或者,您可以创建一个模板类,将变量的值和名称保留为成员变量,但这将是一个矫枉过正。如果你需要这个来进行调试,那么请考虑使用调试器,比如gdb(或者更好的cgdb)--这将是一个更好的选择。

qij5mzcb

qij5mzcb4#

在调用getName的地方,变量名是。没有办法追溯到你传递了一个变量var之前引用过的值。这是因为,就编译器而言,你没有传递一个变量的“名称”,但它的值-在这种情况下是一个整数-为了使代码可读,它是printAddress函数体中的名称。
现在,实现你想要的唯一方法是摆脱函数,并将整个事情实现为宏。
或者,您可以创建一个模板类,将变量的值和名称保留为成员变量,但这将是一个矫枉过正。如果你需要这个来进行调试,那么请考虑使用调试器,比如gdb(或者更好的cgdb)--这将是一个更好的选择。

相关问题