2016-12-04 8 views
3

悪いタイトルには申し訳ありませんが、「私はこのコードを理解していません。変更を提案してください。Cは2つの丸い角かっこで機能しますか?

私はthisコードを読んでいます。私はこの1つのようにC関数を見たことがない:

static void 
VL_XCAT(_vl_vlad_encode_, SFX) 
(TYPE * enc, 
TYPE const * means, vl_size dimension, vl_size numClusters, 
TYPE const * data, vl_size numData, 
TYPE const * assignments, 
int flags) 
{ 
    // function body 
} 

は、特に私は(_vl_vlad_encode_, SFX)で混乱しています。知っている限り、私が見たすべての関数ヘッダーには1組の "丸括弧"(関数のパラメーター)しかありませんが、ここには2つのペアがあります。

最初のものは何を意味していますか?私はこれが後で_vl_vlad_encode_f_vl_vlad_encode_dと呼ばれ、ライブラリコードの他の場所には表示されませんが、どのように接続されているのか分かりません。

+0

おそらく 'VL_XCAT'はマクロですか?それとも、関数ポインタを返す関数ですか? –

+1

'VL_XCAT'は、2つの入力パラメータを連結しているだけで[マクロ](https://github.com/vlfeat/vlfeat/blob/f363f3abf9e55cb117fdbdcdfe44b95ec838ca5f/vl/host.h#L112)です。 – Groo

答えて

3

VL_XCATは、通常2つのトークンを連結するために使用されるマクロです。それは両方の引数からトークン作成します意味(A ## B): _vl_vlad_encode_SFXを - 私はこれが選ぶだろうと言うでしょう

使用浮動小数点変数の型(double/float)に対して定義おそらくdoubleとfloat関数の間には、定義に基づいて_vl_vlad_encode_fまたは_vl_vlad_encode_dが使用されます。

ので

#define SFX d 

場合には、この行を処理した後_vl_vlad_encode_dを作成します。

+1

Goddamit C、なぜ彼らは早くテンプレートを思い付きませんでしたか?このコードスタイルは単純に恐ろしい – justHelloWorld

2

VL_XCATVL_CAT機能的なマクロは、vl/host.h(リンク先のvlad.cと同じディレクトリ)にあります。

VL_CAT(x,y)は単にその引数を連結し、その引数がマクロ展開され以外VL_XCAT(x,y)は、同じである:SFXが定義されている方法に応じ_vl_vlad_encode_f又は_vl_vlad_encode_d

#define VL_CAT(x,y) x##y 
#define VL_XCAT(x,y) VL_CAT(x, y) 

VL_XCAT(_vl_vlad_encode_, SFX)結果、。

ですから、これで終わる、例えば、#define SFX dは(#define TYPE doubleが同時にアクティブであることに注意)を使用した場合:

static void 
_vl_vlad_encode_d 
(double * enc, 
double const * means, vl_size dimension, vl_size numClusters, 
double const * data, vl_size numData, 
double const * assignments, 
int flags) 
{ 
    // function body 
} 

は現在、通常の関数定義のように見える、それはしないのですか?

関連する問題