我一直在解剖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);
什么,你不明白你引用的功能? 'FUNCTION()'或'ATOMIC'宏?为了回答这个问题,我们需要查看它们的定义。你看看宏是否看到他们做了什么? –
我会研究它。我以为这些是C中的一些保留字。 – GKED
啊不,你刚刚遇到了一些'聪明'的宏:)首先检查公共标题,你可能会发现它们或至少有一些参考,他们在哪里定义。 –