【问题标题】:How does this function work?这个功能是如何工作的?
【发布时间】:2011-08-19 01:50:11
【问题描述】:

我一直在剖析 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 中的某种保留字。
  • 啊,不,您刚刚遇到了一些“聪明”的宏 :) 首先检查公共标头,您可能会找到它们,或者至少会找到一些关于它们定义位置的参考。

标签: c gsl


【解决方案1】:

从问题中我不清楚您到底不明白什么?我不知道 FUNCTION 宏是什么,但是你在这里看到的可能是两个 OOP 的 get 函数。

您可以将其视为 gsl_block 类型的对象(在 c++ 中,可能名称不同),它有两个获取内部原始数据 (b->data) 的函数,以及一个获取其大小 (b->size) 的函数.

【讨论】:

  • 这就是问题所在,我不知道FUNCTION是什么意思,和ATOMIC一样。我需要使用C++来实现它,但我不知道写的是什么意思。
  • 你有他们的定义吗?据我所知,FUNCTION 和 ATOMIC 不是 ansi,所以它可以是任何东西。根据上下文,在我看来 FUNCTION 创建访问函数命名。
猜你喜欢
  • 2017-07-12
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-12-28
  • 2020-11-12
  • 2019-06-15
相关资源
最近更新 更多