-6

我使用此代码

#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

有什么想法可以克服这个吗?

4

4 回答 4

4
#define _(x) cout << #x;
#define print(v) _(v); cout << "=" << v;

它没有按照您期望的方式运行的原因是当您从函数内部调用它时,变量的名称是“p”。所以它完全按照你告诉它的做,即使它不是你的意思。

于 2012-07-06T18:51:18.243 回答
3

这似乎工作正常。和的值分别是a和,这正是您的输出所显示的。你期待什么输出?p12

如果您期望第二个输出是b = 2,那么我认为您对该语言有根本的误解。该函数不知道调用函数在调用它时使用的变量名称(如果它完全使用变量)。具有普遍自省能力的高级语言可能能够做这样的事情,但 C++ 不能。

或许更重要的是,通过查看代码或在基本调试器中运行代码来了解您还不知道的变量名称,您可以获得什么?

于 2012-07-06T18:57:30.123 回答
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);
}
于 2012-07-06T19:03:28.523 回答
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);
}

http://ideone.com/AFHEq

但是,你真的不应该写这样的程序。

于 2012-07-06T19:06:49.580 回答