我使用此代码
#define _(x) cout << #x;
作为宏,在程序的开头,返回一个变量名。它在main中运行良好,但在嵌套在其他函数中时根本不运行。例如,如果定义
void print (int p)
{
_(p); cout << "=" << p;
}
int main()
{
int a=1, b=2;
_(a);
cout << " = " << a;
print(b);
}
输出将是 a = 1 p = 2
有任何想法可以克服这个问题吗?
答案 0 :(得分:4)
#define _(x) cout << #x;
#define print(v) _(v); cout << "=" << v;
它不按预期方式运行的原因是当你从函数内部调用它时,变量的名称是“p”。所以它正在做你所说的,即使它不是你的意思。
答案 1 :(得分:3)
这似乎工作正常。 a
和p
的值分别为1
和2
,这正是您的输出显示的值。你期待什么输出?
如果您希望第二个输出为b = 2
,那么我认为您对该语言存在根本性的误解。该函数在调用它时不知道调用函数使用的变量名(如果它使用了一个变量)。具有普遍内省功能的高级语言可能能够做到这一点,但C ++不能。
也许更重要的是,通过查看代码或在基本调试器中运行代码来了解您还不知道的变量名称会获得什么?
答案 2 :(得分:0)
您需要以某种方式将信息传递给打印功能。
struct named {
int &x_;
const char *n_;
operator int () const { return x_; }
named(int &x, const char *n) : x_(x), n_(n) {}
};
const char * name (int, const char *s) { return s; }
const char * name (named &n, const char *s) { return n.n_; }
#define _(x) std::cout << name(x, #x)
void print (named p) {
_(p); std::cout << " = " << p << std::endl;
}
#define print(x) print(named(x, #x))
int main() {
int a=1, b=2;
_(a); std::cout << " = " << a << std::endl;
print(b);
}
答案 3 :(得分:0)
听起来您希望变量的名称成为变量本身的一部分。 C ++在运行时不提供变量名称。您在程序中使用的标识符仅指传递的值。
您可以定义明确包含名称的对象类型:
#include <iostream>
#include <string>
template< typename t >
struct named_value {
t value;
std::string name;
};
template< typename t >
void _( named_value< t > const &nv ) { // not a good name for a function
std::cout << nv.name; // not a good semantic for a function
}
template< typename t >
std::ostream &operator<< ( std::ostream &s, named_value< t > const &v ) {
return s << v.value;
}
typedef named_value< int > named_int;
void print (named_int p)
{
_(p); std::cout << "=" << p;
}
int main()
{
named_int a = { 1, "a" }, b = { 2, "b" };
_(a);
std::cout << " = " << a;
print(b);
}
但是,你真的不应该写这样的程序。