2011-08-11 12 views
8

GSLライブラリのコードを勉強していて、ヘッダファイルの先頭にいくつかの行があります。 #undef、#ifdefなどは何をするのか分かりますが、私が理解していないのは、なぜ基本的に_BEGIN_DECLSの定義をリセットしたのでしょうか?技術的に、これまでの定義はないはずですよね?つまり、これらのものは静的であり、変更の対象にはならないということです。 とにかく、ここでのコードの抜粋です:C#での#undefの使用

#undef __BEGIN_DECLS 
    #undef __END_DECLS 
    #ifdef __cplusplus 
    # define __BEGIN_DECLS extern "C" { 
    # define __END_DECLS } 
    #else 
    # define __BEGIN_DECLS /* empty */ 
    # define __END_DECLS /* empty */ 
    #endif 
+6

なぜdownvoteですか?私には妥当な質問のようです。 –

答えて

10

パラメータリストと交換リストが同一でない限り、あなたが#defineすでに定義されたマクロに許可されていません。

extern "C" {以外のものに置き換えられていたと定義されていた場合、#define __BEGIN_DECLS extern "C" {は無効となり、プログラムは不正な形式になります。

技術的には、これまでの定義はありませんか?

確かにありました。

+0

ありがとうJames、 が意味を成しています。他の目的のために_BEGIN_DECLSの他の可能な定義は考えていませんでした。 – GKED

+0

特に、二重アンダースコアの識別子は実装のために予約されているためです。 –

2

呼び出している別のライブラリが同じ名前を使用している場合は、すでに定義されています。

したがって、別の定義で定義できないため、最初に#undefと、次に#defineを呼び出します。

#ifdefまたは#ifndefを使用するのが適切な場合もあります。