【发布时间】:2015-11-05 07:10:55
【问题描述】:
我正在扩展我们的内部调试库,但遇到了奇怪的问题。我想将变量名输出为字符串。从这个站点上的elsewhere,我发现可以在文件中使用宏来执行此操作:
#define VarToStr(v) #v
...
printf("%s\n", VarToStr(MatName));
这会输出MatName。但是现在让我们通过一个跨文件的函数来试试这个(矩阵是一个定义的类型):
// DebugHelpers.h
#define VarToStr(v) #v
...
void PrintMatrix(const Matrix &InputMat)
{
printf("%s\n", VarToStr(InputMat));
... // output InputMat contents
}
// DataAnalysis.cc
#include DebugHelpers.h
...
void AnalysisSubProgram342()
{
Matrix MatName;
...
PrintMatrix(MatName);
}
这会输出InputMat,而不是MatName。另一个文件中的函数如何从调用文件中获取变量名?
虽然更复杂的解决方案(包装类等)对更大的社区有用,但我的实现需要尽量减少对预先存在的代码/类的影响。
更新:
受 zenith 的 cmets 的启发,为了比较,我实施了他提出的两个解决方案,并且都快速运行。该宏适用于简单的输出,而该函数允许更复杂的工作(和类型检查/重载)。我不知道预处理器宏会如此复杂。我会记住两者以备将来使用。谢谢!
【问题讨论】:
-
不可能。
InputMat被称为InputMat,不管它的值来自哪里。 -
C/C++未定义,因为没有排序点(除非您已重载++), -
@Bathsheba 哈!好一个:p
-
@Bathsheba:(很好!)重载只能是 C++,所以可以删除 C 标签?
-
“#”将您作为前缀的文本字符串化;它是一个预处理器功能,不了解范围或数据类型,因此您不能将其用于您所描述的内容。
标签: c++