2011-07-02 7 views
0

で構築された関数名を呼び出すと、私はコードの下からユニークな機能本体を構築しています:はと仮定__LINE__

#define TOKENPASTE(x, y) x ## y 
#define TOKENPASTE2(x, y) TOKENPASTE(x, y) 
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) 

どのように私は、この関数を呼び出すことができますか?

マクロ定義は、Creating C macro with ## and __LINE__ (token concatenation with positioning macro)から取得しました。

+0

編集した質問..ここで関数を呼びたいのですか?もっと詳しく記述することができます(その行に 'Unique_1、Unique_2、...'があれば関数を呼び出すことができます) – iammilind

+0

私の質問はif一意の関数が定義されようとしましたが、呼び出すことはできません。@ iammilind、どのようにグローバルスコープ内で関数を呼び出せますか? – Chethan

+0

それを簡単に呼び出すことはできませんが、あなたは私の答えを見ることができます。 'template'の助けを借りて呼び出すことができます。 – iammilind

答えて

1

番号You にできません。実行時に関数名を判別できないためです。 (すなわち、いずれかUnique_22Unique_44を呼び出します。しかし、あなたは間違いなくUnique<22>Unique<44>を呼び出すことができます)

だからあなたの代わりにtemplateソリューションを使用することができます。以下のようにUniqueを宣言します。

template<unsigned int LINE> void Unique(); 

そして#defineこのようなマクロ:あなたのコンパイラがサポートしている場合__COUNTER__の代わり__LINE__を使用する

#define UNIQUE template<> Unique<__LINE__>() {} 

Iのアドバイス。 [注意:任意の行にだけ一度UNIQUEを呼び出すことができ、またマクロがグローバルまたはnamespaceスコープ(ないメソッド内)に展開されなければならないことを意味する]

+0

リンクされた質問に対する答えは、プリプロセッサでこれを行うことができることを示しています(http://stackoverflow.com/questi)。 ons/1597007) –

+0

@Mike、始めの部分を編集しました。 – iammilind

+0

編集は意味をなさないと思われます。実行時にテンプレート引数を決めることはできません(ただし、コンパイル時定数である可能性がありますが、バージョンがプリプロセッサバージョンに比べて唯一の利点であると思われますが、それを行う方法がわかりません) 。 –

0

で与えられるものとコードを交換した後あなたがその関数を直接呼び出すことはできません。なぜなら、コードが変更された場合にはその名前が変更されていることが分かりませんからです。私はこれがどのようにコード内で役に立つのか分かりません(おそらくUnique_[0-9]+のようなシンボルのオブジェクトをスキャンしていますか?とにかく、間接的に使用されるでしょう、と言ったように、あなたはそれを確実に使用することはできません)

関連する問題