在 Rcpp 的另一个 cpp 文件中定义的函数中使用一个 cpp 文件中定义的函数

Use function defined in one cpp file in function defined in another cpp file in Rcpp

我在文件 add.cpp 中定义了一个名为 add 的 c++ 函数(add.cpp[=36 的内容=] 下面):

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double add(double a, double b) {
  return a + b;
}

我在 multiplyandadd.cpp 文件中定义了另一个名为 multiplyandadd 的 c++ 函数(multiplyandadd.cpp[ 的内容=36=] 下面)从上面调用 add 函数:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double multiplyandadd(double a, double b, double c) {
  return c*add(a, b);
}

为了让它工作,我想我应该在子文件夹 /inst/include[= 中创建一个头文件 add.h我的包的 36=] 并在 add.h...

中定义函数 add

add.h的内容应该是什么?如何在add.h中定义这个函数add以便编译包?

我确信这是非常基本的,之前可能已经回答过很多次,并且用大量示例进行了很好的记录...只是碰巧我在阅读文档和 Whosebug 答案的几个小时内找不到示例, ...

好的。想通了... :)

add.h:

//add.h

#ifndef __ADD_H_INCLUDED__   // if add.h hasn't been included yet...
#define __ADD_H_INCLUDED__   //   #define this so the compiler knows it has been included

double add(double a, double b);

#endif

而且,我需要 src 中的 Makevars 内容:

PKG_CXXFLAGS = -I../inst/include

我理解这是最基本的东西。在某个地方有这样一个基本的例子会让第一次使用 Rcpp 的人更容易。

使用 header 时,您需要使用 inclusion guard。在包含保护中,提供适当的函数定义。如果您的函数有默认参数,请在 header 文件中包含默认参数 only

例如:

inst/include/add.h

#ifndef PACKAGENAME_ADD_H
#define PACKAGENAME_ADD_H

double add(double a = 0.1, double b = 0.2);

#endif

src/add.cpp

#include <Rcpp.h>
#include <add.h>

// [[Rcpp::export]]
double add(double a, double b) {
  return a + b;
}

src/multiplyandadd.cpp

#include <Rcpp.h>
#include <add.h>

// [[Rcpp::export]]
double multiplyandadd(double a, double b, double c) {
  return c*add(a, b);
}

src/Makevars

PKG_CPPFLAGS =  -I../inst/include/