2012-02-24 2 views
6

? #includeで汚れているかもしれませんか?C/C++ #defineマクロ内のマクロ?</p> <pre><code>#define C_OR_CPP(C__, CPP__) #ifdef __cplusplus CPP__ #else C__ #endif </code></pre> <p>それは可能です:私のような何かをしたいと思います

理由:vector<stuff>*というメンバ変数を使用するヘッダーを作成しますが、Cでは単純にvoid*になります。

TIA

+6

ヨ仲の良い友達、私はあなたがマクロを好き聞い=>必要があります

#define SELECT1(a, b) a #define SELECT__cplusplus(a, b) b #define xcat(a,b) a##b #define concat(...) xcat(__VA_ARGS__) #define C_OR_CPP(C, CPP) concat(SELECT, __cplusplus)(C, CPP) C_OR_CPP(1, 2) 

他の環境

#define __cplusplus value 

と値を生成する必要があり、標準C++にcomformingコンパイラを__cplusplusマクロをチェック? – Gui13

+0

@ Gui13申し訳ありませんが、どちらもお望みですか?あなたはC++とCのヘッダを他にどのように使っていますか? – imacake

+1

@imacake:ねえ、申し訳ありません、私はちょうど[インターネットmeme](http://knowyourmeme.com/memes/xzibit-yo-dawg)への悪い参照をしました。 – Gui13

答えて

11

(phresnelの発言あたりの実装に二重のアンダースコアで名を残す)

+0

これは私が見たすべての場合に実行される方法です。例えば、このパターンは 'WEAK'のマクロを定義するために使用されます(多重定義エラーでリンカを停止するのではなく、別のコンパイル単位で同じ名前の関数定義を別のコンパイル単位で置き換えることができます)。使用中のコンパイラ(gccやIAR、Keilなど)。 –

+0

ちょうどいい..! – imacake

1

C++ではありません。しかし、あなたは可能です

#ifdef __cplusplus 
# define CPP 
#else 
# define C 
#endif 

これは単なる病理学的な例です。ダブルアンダースコアはライブラリ実装者に予約されていることにも注意してください(17.6.4.3.2グローバル名参照)。

ベクトルですが、Cでは単純に無効にしたいのですが、です。

だから、何が

struct Foo { 
    #ifdef __cplusplus 
    ... 
    #else 
    ... 
    #endif 
}; 

のような溶液に対して話すか、何が異なるプログラミング言語のためのさまざまなAPIを提供する反対話しますか?

#ifdef __cplusplus 
#define C_OR_CPP(C, CPP) CPP 
#else 
#define C_OR_CPP(C, CPP) C 
#endif 

に問題は何

+0

あなたの例では 'CPP'は'ベクトル * 'で' C'は 'void *'でしょうか?それは良い、haventそれの考えです。それ以外の解決策が見つからない場合に考慮します。 – imacake

+0

**異なるAPI **:いいえ。私は実際には、世界のすべてが1つのルールから派生した信念を持ったプログラムに取り組んでおり、それに向けて簡素化しなければなりません(私の頭の中でその哲学を持っています。 (**解決策の例**):これは非常に汚れていて、読みにくいです。なぜ何か良いことを尋ねないのはなぜですか? = D – imacake

+0

@imacake:私はルールのことについて混乱していますが、CとC++の関係は何ですか? –

1

AProgrammerはすでにあなたに正しい答えが、「それは可能である」との答えを与えられました質問の一部はノーです。マクロ展開はすべてのプリプロセッサディレクティブが処理されるまで発生しないので、#defineまたは#ifdefに展開されるマクロは、通常のソーステキストとしてコンパイラに渡され、コンパイラはyakになります。

0

私の英語は貧弱で、言語ミスや誤字脱字があれば申し訳ありません。

#ifdefがマクロ呼び出しをラップしてはならない場合は、それほど優雅ではない解決策があります。

g ++のみ: これは選択的な機会にお試しいただけます。しかし、aまたはbにカンマがある場合は、回避策がまだ必要です。 C++環境では__cplusplusが "1"に定義され、__cplusplusはC++環境では "1"に定義されています。 199711L

+0

これが@AProgrammerの受け入れられた回答に何を追加するか分かりません –

関連する問題