2011-01-14 19 views
2
#define BLAH word 

cout << BLAH; 

これを実行する方法はありますか?#定義された用語を使用する方法はありますか?

+2

私はあなたが何を意味するかわかりません。何を出力すると思いますか?プリプロセッサが 'BLAH'を置き換えるものを出力します。これが 'std :: ostream'に挿入できるものなら、あなたは働くプログラムを持っています。 –

+0

私は数の異なる表現、すなわちfloatとdoubleのプログラムをテストしています。 私はそれを印刷したい: 定義された用語が浮動小数点である場合の "フロートのテスト"。 – Jeff

+0

あなたが達成しようとしていることはまだ分かりません。あなたの要件の記述から、なぜ '#define TERM" float "'と言うことができないのか、 '' std :: cout << TERM << std :: endl; '' –

答えて

3
  1. 「勘定書」はあなたのものではありません。これはグローバル変数で、std::ostreamタイプのインスタンスです。たとえば、 "coutへの出力"。

  2. #defineはテキスト置換を行います。テキストエディタで検索と置換を使用してBLAHwordに置き換えた場合と基本的に同じです。したがって、cout << BLAH;の行はcout << word;になります。それが機能しない場合は、cout << word;がそのスコープ内で有効なステートメントではないためです。プリプロセッサは周囲のテキストを気にしません。必要であればそれは基本的に、コードのゼロ理解(それはあなたが任意の空間に入れていない場合は事業者や他の句読点をばらばらすなわち、コードをトークン化する方法を知っているが、それはそれについてです。)

+0

私がプリントアウトしようとしている言葉は浮動小数点型なので、それが型であることを認識しているので、おそらく問題がありますか? – Jeff

+1

...単語を印刷する場合は、引用符で囲みます。 'cout << word;'は '' word'変数の内容を標準出力に出力することを意味します。 'cout <<" word ";"標準出力にテキスト 'word'を出力することを意味します。 –

1

を持っています単語"word"を印刷するには、あなたが行うことができます:

#define STRINGIFY(x) #x 

cout << STRINGIFY(word); 
+2

OPはマクロの置き換えを印刷したいので、実際にはさらに1つのレベルが必要です。 –

4

は、間接の余分なレベルがマクロの値は代わりの名前の文字列化されます

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

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

試してみてくださいマクロ

Tested on ideone

0

OK、さんがあなたのコメントに基づいて、再びこれを試してみましょう:私は数、すなわち、floatとdoubleの異なる表現のためのプログラムをテストしてい

。定義された用語が浮動小数点の場合、「浮動小数点数のテスト」を印刷します。

これはあなたが本当に何を意味するかであるようですね:

私は次のようなコードがあります。

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

を、私はそれぞれのマクロを作りたいですこれらの行は、テキストが型キャストと一致するようにします。その場合

、あなたはこのような何かしたい:typeid(T).name()の値が定義された実装で、あり得ること

#include <typeinfo> 

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

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

注:

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

DEBUG(float, value); 
DEBUG(double, value); 
1

を私はあなたがこのような何かをしたい疑います何もない。それぞれの型に対して、関数を自分で記述することなく、確実に型を出力する方法はありません。

あなたも表現の種類を推定過負荷を行うことができます。

#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); 
} 

(不要である、これは式を評価していますが、私はそれが心配である疑い。)

1

私は数の異なる表現、すなわちfloatとdoubleのプログラムをテストしています。定義された用語が浮動小数点の場合、「浮動小数点数のテスト」を印刷します。

プリミティブの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; 
} 

お知らせが、 "フロート"と "ダブル"の名前が好きな場合は、可能性があります。

あなたは本当に、本当にパラメータをstringizeしたい場合は - またはあなただけのマクロについて興味があれば:

#define DO_TEST(T) do_test<T>(#T) 
int main() { 
    DO_TEST(float); 
    DO_TEST(double); 
    return 0; 
}