2011-08-19 2 views
2

나는 gsl 라이브러리를 해부했습니다. abd는 헤더 파일 gsl_block_double.h와 함수 정의가있는 여러 소스 파일을 발견했습니다. many 중 하나는 block_source.c입니다. 나는 C를 모른다. 그래서 그 함수들이 어떻게 작동하는지, 어떻게 C++로 구현해야하는지 잘 모르겠다. 어쨌든, 여기에 그 기능의 두 가지로 정의를 헤더와 소스 파일은 다음과 같습니다 어떤 도움을 크게 감상 할 수이 기능은 어떻게 작동합니까?

#ifndef __GSL_BLOCK_DOUBLE_H__ 
#define __GSL_BLOCK_DOUBLE_H__ 

#include <stdlib.h> 
#include <gsl/gsl_errno.h> 
#include <gsl/gsl_types.h> 

#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 

__BEGIN_DECLS 

struct gsl_block_struct 
{ 
    size_t size; 
    double *data; 
}; 

typedef struct gsl_block_struct gsl_block; 

GSL_EXPORT gsl_block *gsl_block_alloc (const size_t n); 
GSL_EXPORT gsl_block *gsl_block_calloc (const size_t n); 
GSL_EXPORT void gsl_block_free (gsl_block * b); 

GSL_EXPORT int gsl_block_fread (FILE * stream, gsl_block * b); 
GSL_EXPORT int gsl_block_fwrite (FILE * stream, const gsl_block * b); 
GSL_EXPORT int gsl_block_fscanf (FILE * stream, gsl_block * b); 
GSL_EXPORT int gsl_block_fprintf (FILE * stream, const gsl_block * b, const char *format); 

GSL_EXPORT int gsl_block_raw_fread (FILE * stream, double * b, const size_t n, const size_t stride); 
GSL_EXPORT int gsl_block_raw_fwrite (FILE * stream, const double * b, const size_t n, const size_t stride); 
GSL_EXPORT int gsl_block_raw_fscanf (FILE * stream, double * b, const size_t n, const size_t stride); 
GSL_EXPORT int gsl_block_raw_fprintf (FILE * stream, const double * b, const size_t n, const size_t stride, const char *format); 

GSL_EXPORT size_t gsl_block_size (const gsl_block * b); 
GSL_EXPORT double * gsl_block_data (const gsl_block * b); 

__END_DECLS 

#endif /* __GSL_BLOCK_DOUBLE_H__ */ 

// block_source.c 

size_t 
FUNCTION(gsl_block,size) (const TYPE(gsl_block) * b) 
{ 
    return b->size ; 
} 

ATOMIC * 
FUNCTION(gsl_block,data) (const TYPE(gsl_block) * b) 
{ 
    return b->data ; 
} 

가! 감사합니다. 정확히 무엇을 이해하지 못하는

size_t gsl_block_size (const gsl_block * b); 
double * gsl_block_data (const gsl_block * b); 
+0

참조한 기능에 대해 정확히 이해하지 못합니까? 'FUNCTION()'또는'ATOMIC' 매크로? 우리는이 질문에 대답하기 위해 그들이 정의 된 곳을 볼 필요가 있습니다. 그들이하는 일을보기 위해 매크로를 보았습니까? –

+0

나는 그것을 조사 할 것이다. 나는 그것들이 C에서 어떤 종류의 보류 된 단어라고 생각했다. – GKED

+0

아, 아니, 방금 "영리한"매크로를 만났어. 먼저 공개 헤더를 확인해 보라. 한정된. –

답변

0

질문에서 나에게 분명하지 않다 :

편집 : 내가 정의 기능이 있음을 지정해야합니다 같은 느낌? 나는 FUNCTION 매크로가 무엇인지 모르지만, 여기서 볼 수있는 것은 아마도 OOP get 함수 두 개일 것입니다.

내부 원시 데이터 (b-> 데이터)에 대한 두 가지 get 함수와 크기 (b-> size)가있는 유형 gsl_block (C++에서는 이름이 다를 수 있음)).

+0

그게 문제인데, 나는 무엇이 기능을 의미하고 ATOMIC과 같은지 모르겠다. C++을 사용하여 구현해야하지만 작성한 내용의 의미는 알지 못합니다. – GKED

+0

정의가 있습니까? FUNCTION과 ATOMIC은 ansi가 아니므로 내가 아는 한 그것이 무엇이든 될 수 있습니다. 상황에 따라 FUNCTION이 액세스 함수 이름을 만드는 것으로 보입니다. – roni