【问题标题】:Use function defined in one cpp file in function defined in another cpp file in Rcpp在 Rcpp 中另一个 cpp 文件中定义的函数中使用一个 cpp 文件中定义的函数
【发布时间】:2017-07-03 19:02:22
【问题描述】:

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

#include <Rcpp.h>
using namespace Rcpp;

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

我在 multiplyandadd.cpp 文件(下面 multiplyandadd.cpp 的内容)中定义了另一个名为 multiplyandadd 的 c++ 函数,它从上面调用 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 并定义函数 @987654326 @ in add.h...

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

我确信这是非常基本的,之前可能已经回答了很多次,并且有大量的示例进行了很好的记录...碰巧我在阅读文档、stackoverflow 答案、. ..

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

    使用标头时,您需要使用inclusion guard。在包含保护中,提供适当的函数定义。如果您的函数有默认参数,请在头文件中包含默认参数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/
    

    【讨论】:

    • 这可以用来在另一个包中使用add吗?
    【解决方案2】:

    好的。想通了... :)

    添加.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 变得更容易。

    【讨论】:

    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多