是否可以通过其他变量访问变量值,如下所示
char var[30];
char buffer[30];
strcpy(buffer, "ABC");
/*variable var is holding the "buffer" variable name as string*/
strcpy(var,"buffer")
有没有办法通过变量 var 访问缓冲区变量值“ABC”。?
是否可以通过其他变量访问变量值,如下所示
char var[30];
char buffer[30];
strcpy(buffer, "ABC");
/*variable var is holding the "buffer" variable name as string*/
strcpy(var,"buffer")
有没有办法通过变量 var 访问缓冲区变量值“ABC”。?
在 C 中没有任何实际的方式,而且你也不想这样做。将程序逻辑与变量名称联系起来是一个可怕的想法。通常我看到人们在他们真正需要的是某种集合类型(以及数组、地图等)时尝试这样做。
如何让我们了解您试图解决的问题?
根据您的评论:
我需要动态调试消息,我有一个文件,其中包含我要打印的每个函数变量。
在宏中使用字符串化:
#define str(s) #s
int main() {
int bar;
str(bar) /* replaced by "bar" */
}
并非没有重要的样板代码。变量名在编译时被消除。
理论上,您可以存储从变量名到指向变量的指针的映射。
不,你不能。如果您想要间接访问,则声明一个指针并分配var
给它。
char *forVar = var;
// Now you can access/modify via [] operator.
所以基本上你想在写入/读取/传递给函数等时记录一些变量?
如前所述,使用已编译的 C 执行此操作很困难,特别是如果您正在优化可执行文件(编译语句上的 -0n),在这种情况下,某些变量可能会完全消失,或者被其他变量重用。
使用 GDB
话虽如此,我知道 gdb 可以记录变量访问和类似的东西。如果您要编写 Python 脚本(请参阅http://sourceware.org/gdb/onlinedocs/gdb/Python.html),您应该能够编写脚本来记录变量内容。
有关更多信息,请参阅此问题:Do specific action when certain breakpoint hits in gdb
仅按需使用,使用预编译器脚本
或者,如果您只是想按需执行,最好使用预处理脚本添加自定义宏或类似内容,使用 csv 文件作为输入:
for each line in CSV:
read variable_name, file_name, variable_type
find all occurrences of variable_name in file_name
for each occurrence
insert printf(....)
仅按需使用,使用宏
祝你好运。没有一个很好的方法可以做到这一点,因为您通常需要某种查找,并且您需要一种有选择地将变量输出到您的打印函数的方法。在某些情况下,您可以执行以下操作:
static char _LOGGED_VAR_001 = 'z';
static char _LOGGED_VAR_002 = 'z';
#define cMyVar _LOGGED_VAR_001
#define LOG_ALL_VARS() printf("Vals: %c, %c", _LOGGED_VAR_001, _LOGGED_VAR_002)
void myFunc()
{
char cMyVar; // Gets macro'd to _LOGGED_VAR_001 with LOCAL scope
cMyVar = 'a'; // LOCAL scope _LOGGED_VAR_001 becomes 'a'
LOG_ALL_VARS(); // At this point you print out the LOCAL _LOGGED_VAR_001
// and the global _LOGGED_VAR_002
}
你会得到Vals: a, z
这非常丑陋,仅适用于具有局部范围的变量,内存消耗混乱,可能容易出错并且通常是一个坏主意。
按需,堆/堆栈转储
如果您有足够的存储空间,您可以按需将所有内存转储到文件中。这可能不是很便携,这取决于它是如何完成的。我不确定如何以可靠的方式做到这一点。
推荐
使用 GDB 进行设计时诊断。这就是它的设计目的:)
对于(例如)分析已发布的代码(自动错误报告),完整转储然后随意分析可能是相关的。
您可以尝试使用工会
例如:
union example {
char var[40];
char buffer[40];
} e1;
strcpy(e1.var, "ABC");
printf("%s is same as %s", e1.var, e1.buffer);