3
#define BLAH word

cout << BLAH;

これを行う方法はありますか?

4

6 に答える 6

8

試す

#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)

#define BLAH word
cout << STRINGIFYMACRO(BLAH);

間接レベルが追加されると、マクロの名前ではなく、マクロの値が文字列化されます。

ideoneでテスト済み

于 2011-01-14T03:57:11.277 に答える
6
  1. 「cout」はあなたがすることではありません。これは、std::ostreamタイプのインスタンスであるグローバル変数です。たとえば、「出力先cout」と言うことができます。

  2. #defineテキストの置換を行います。BLAH基本的には、テキストエディタで検索と置換を使用して。に置換した場合と同じですword。したがって、行cout << BLAH;はに変わりますcout << word;。動作しない場合cout << word;は、がそのスコープ内の有効なステートメントではないためです。プリプロセッサは、周囲のテキストを気にしません。基本的にコードの理解はありません(コードをトークン化する方法を知っています。つまり、スペースを入れない場合は演算子やその他の句読点を分解しますが、それだけです)。

于 2011-01-14T03:41:10.960 に答える
1

単語を印刷したい場合は、次の"word"ことができます。

#define STRINGIFY(x) #x

cout << STRINGIFY(word);
于 2011-01-14T03:52:23.297 に答える
1

私はあなたがこのようなものが欲しいと思う:

#include <typeinfo>

template <typename T>
void print_type()
{
    std::cout << typeid(T).name() << std::endl;
}

int main()
{
    print_type<float>();
    print_type<int>();
}

の値typeid(T).name()は実装で定義されており、まったくない場合があることに注意してください。タイプごとに関数を自分で作成せずに、保証された方法でタイプを出力する方法はありません。

式のタイプを推測するオーバーロードを作成することもできます。

#include <typeinfo>

template <typename T>
void print_type(const T&)
{
    std::cout << typeid(T).name() << std::endl;
}

int main()
{
    print_type(5.0f);
    print_type(5.0);
}

(これは式を評価することに注意してください。これは不要ですが、それが問題になるとは思えません。)

于 2011-01-14T04:24:16.367 に答える
1

数値のさまざまな表現、つまりfloatとdoubleについてプログラムをテストしています。定義された用語がfloatの場合、「Testingforfloat」を出力してほしい。

マクロをプリミティブtypedefとして悪用する必要はありません。

template<class T>
void do_test(char const *name) {
  std::cout << "Testing " << name << "...\n";
  T var = foo();
  bar(var);
}

int main() {
  do_test<float>("single precision");
  do_test<double>("double precision");
  return 0;
}

これにより、テストのパラメーターを単純に文字列化するのではなく、各テストに異なる名前(できればもっと意味のある名前)を付けることができますが、必要に応じて「float」と「double」を名前にすることができます。

本当に、本当にパラメータを文字列化したい場合、またはマクロに興味がある場合は、次のようにします。

#define DO_TEST(T) do_test<T>(#T)
int main() {
  DO_TEST(float);
  DO_TEST(double);
  return 0;
}
于 2011-01-14T04:25:00.047 に答える
0

OK、あなたのコメントに基づいて、これをもう一度試してみましょう:

数値のさまざまな表現、つまりfloatとdoubleについてプログラムをテストしています。定義された用語がfloatの場合、「Testingforfloat」を出力してほしい。

これがあなたの本当の意味のように聞こえます:

私は次のようなコードを持っています:

cout << "As a float:" << float(value) << endl;
cout << "As a double:" << double(value) << endl;

そして、テキストが型キャストと一致するように、これらの各行にマクロを作成したいと思います。

その場合、次のようなものが必要です。

#define DEBUG(t, x) cout << "As a " #t ":" << t(x) << endl

DEBUG(float, value);
DEBUG(double, value);
于 2011-01-14T03:58:21.670 に答える