2016-12-04 3 views
3

나쁜 제목에 대해 유감 스럽지만 "이 코드를 이해하지 못한다"는 점을 제외하고는 더 이상 좋은 생각이 들지 않았습니다. 제발, 수정 제안을 주시기 바랍니다.두 개의 둥근 괄호 쌍이있는 C 함수?

나는 this 코드를 읽습니다. 나는이 같은 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)에 의해 혼동하고 있습니다. 알아 두어야 할 모든 함수 헤더에는 두 개의 쌍이 있지만 여기에는 하나의 "둥근 괄호 쌍"(함수의 매개 변수) 만 있습니다.

첫 번째 의미는 무엇입니까? 이 코드는 나중에 _vl_vlad_encode_f_vl_vlad_encode_d과 연결되어 있으며 라이브러리 코드의 다른 곳에서는 나타나지 않지만 연결 방법을 이해할 수 없습니다.

+0

아마도 'VL_XCAT' 매크로입니까? 아니면 함수 포인터를 반환하는 함수입니까? –

+1

'VL_XCAT'은 두 개의 입력 매개 변수를 연결하는 [매크로] (https://github.com/vlfeat/vlfeat/blob/f363f3abf9e55cb117fdbdcdfe44b95ec838ca5f/vl/host.h#L112)입니다. – Groo

답변

3

VL_XCAT은 일반적으로 두 개의 토큰을 연결하는 데 사용되는 매크로입니다. 그것은 모두 인수에서 토큰을 생성 할 것이다 의미 (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)은 동일합니다 _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) 결과 SFX이 정의 된 방법에 따라. 그것은

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 
} 

지금은 일반 함수 정의처럼 보이는하지 않습니다

그래서 당신은 때 #define SFX d (#define TYPE double가 동시에 활성화되어 있습니다)를 사용, 예를 들어, 이것으로 끝?