2011-08-19 90 views
2

我一直在解剖gsl庫abd遇到頭文件gsl_block_double.h和多個源文件及其函數定義。其中一個是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獲取函數。

你可以把它看作gsl_block類型的對象(在C++中,可能名稱不同),它有兩個獲取內部原始數據的函數(b-> data),另一個獲取函數的大小(b-> size )。

+0

這就是問題所在,我不知道「功能」與ATOMIC意味着什麼。我需要使用C++實現它,但我不知道所寫的內容。 – GKED

+0

你有他們的定義嗎?功能和ATOMIC不是我所知道的,所以它可能是任何東西。就上下文而言,在我看來,FUNCTION創建了訪問函數的命名。 – roni