-6

私はこのコードを使用します

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

マクロとして、プログラムの先頭で、変数名を返します。メインではうまく機能しますが、他の関数にネストされているとまったく機能しません。たとえば、定義する場合

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

2 番目の出力が であると予想している場合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 に答える