C++ 返回变量名C++;

C++ 返回变量名C++;,c++,macros,C++,Macros,我使用这个代码 #define _(x) cout << #x; #define(x)cout#define(x)cout这似乎工作正常。a和p的值分别为1和2,这正是您的输出所显示的。你期望什么样的产出 如果您希望第二个输出是b=2,那么我认为您对该语言有一个基本的误解。函数不知道调用函数在调用时使用的变量名(如果它使用了变量)。具有普遍内省能力的高级语言可能能够做到这一点,但C++不能。 也许更重要的是,通过查看代码或在基本调试器中运行代码,您不知道变量的名称,但知道该变量的名

我使用这个代码

#define _(x) cout << #x;

#define(x)cout
#define(x)cout这似乎工作正常。
a
p
的值分别为
1
2
,这正是您的输出所显示的。你期望什么样的产出

如果您希望第二个输出是
b=2
,那么我认为您对该语言有一个基本的误解。函数不知道调用函数在调用时使用的变量名(如果它使用了变量)。具有普遍内省能力的高级语言可能能够做到这一点,但C++不能。


也许更重要的是,通过查看代码或在基本调试器中运行代码,您不知道变量的名称,但知道该变量的名称会有什么好处?

您需要以某种方式将信息传递到print函数中

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);
}
struct命名{
int&x;
const char*n;
运算符int()常量{return x_;}
命名(int&x,const char*n):x_ux,n_n(n){
};
常量字符*名称(int,常量字符*s){return s;}
常量字符*名称(命名为&n,常量字符*s){return n.n_;}

#define ux(x)std::cout听起来像是希望变量的名称成为变量本身的一部分。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);
}
#包括
#包括
模板
名为_值的结构{
t值;
std::字符串名;
};
模板
void(命名为_valueconst&nv){//不是函数的好名字
标准::cout
std::ostream和操作员const&v){
返回名为_int的s;
无效打印(命名为_int p)
{

_(p);std::cout但这正是我们所期望的。第一个变量名为
a
,第二个变量名为
p
为什么?为什么>一个人对变量名的名称感兴趣?他期望在输出上有一个b=2,但它不起作用,因为他的宏是用来吐出变量名的,而变量名会根据他输入的范围而变化在您的子函数中,编译器将变量的名称视为局部作用域变量名称,并将在链接到作用域的更高级别时连接这些编译符号。我能想到的存储变量名称的唯一方法是从同一作用域调用宏,然后将其交给类常量构造函数或其他函数来维护变量。@Wug-调试器更简单,也更有效。非常糟糕的命名约定:宏名称不描述其用途;标识符以下划线“25;”开头;对于宏的用途或用法没有任何注释。如果询问者真的只需要从任何子函数打印,这将起作用。这并不是一个坏消息如果是这样的话,我的想法是,但是如果询问者想从多个子函数中完成各种各样的事情,他必须为每个子函数提供一个宏,这也会破坏递归的能力,并使他的可执行文件的大小非常大,这取决于他需要调用他的函数的次数。是的,谢谢这是我所希望的结果,我明白了问题所在,我没有表达清楚自己的想法,但我没有一个线索来做什么。我只是做一些练习来提高C++的水平。我知道它有点不顺畅。@ USER(15775):C++中改进的一个好地方是避免宏。当然,我使用模板作为最后手段。也就是说,我想要一系列具有类似属性的类,比如堆栈,queues@EdHeal没有理由认为他只想命名他的
int
s。在这里避免使用模板有好处吗?@EdHeal因为为每个案例定义一个单独的类就可以做到这一点。谢谢你的帮助gh.你可以这样做,但这不是我所提倡的。你根本没有这样做。有人认为你关心的是你的工作安全。@EdHeal LOL,你否决了,因为模板太难阅读。工作安全确实。我很感激你们,我理解很多事情。就像我说的,我只是在做一些练习。我定义编辑了一类点,需要以“P(x,y)”的格式“打印”这些点。我认为这是一个好主意,可以使程序更短、更可读,而不是对每个点进行写入(P);cout@user1507571:但听起来Wug的解决方案正是您真正想要的:使
print
成为一个宏。
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);
}
#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);
}