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

问题描述

我正在编写一个演示程序来打印变量的地址。为了使代码看起来更简洁,我创建了一个文件,其中声明了该函数(例如:pointer.h)和一个用于调用函数的C文件(例如,main.c)。我想用在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。谁能告诉我我应该做些什么改变,请解释一下。

解决方法

您不能使用显示的函数来打印变量的地址。原因是a是局部变量,与您传递给printAddress value 的变量具有不同的标识。

您也无法获得名称,因为该名称在该上下文中不存在。

但是,您可以使用宏:

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

请注意,#是预处理器的字符串化运算符;它将令牌转换为C字符串文字(实际上只是在令牌周围添加引号)。

完整示例:

#include <stdio.h>

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

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

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

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

我尝试使用宏,但是它的变量a的printsAddress为0x7fff2424407c,而不是变量var的预期输出地址为0x7fff2424407c。

在调用getName的位置,变量名称为 a 。无法追溯您之前已传递了变量var所引用的值。这是因为,就编译器而言,您没有传递变量的“名称”,而是它的值(在这种情况下为整数),为了产生易于理解的代码,其名称为 a 在printAddress函数主体中。

现在,实现所需目标的唯一方法是摆脱功能并将整个对象实现为宏。

或者,您可以创建一个模板类,该模板类将变量的值和名称保留为成员变量,但这可能会过大。如果出于调试目的需要此功能,请考虑使用gdb(或更好的cgdb)之类的调试器-这将是更好的选择。