我有一堆 Rcpp 代码,我必须将它们重写为无 Rcpp 的 C/C++ 扩展(由于它的许可),幸运的是,结果并没有我担心的那么痛苦。但是为了编写最干净的代码,我想确保我没有过度使用 PROTECT/UNPROTECT。 Writing R Extensions 文档提到“那么保护眼前的一切不是一个好主意......”所以我试图尽职尽责。
所以这就是我想检查的东西。在阅读为 R 编写 C 扩展的所有示例时,我看到了很多示例,其中作者保护传递的函数的参数,例如取自 this article 。
#include <R.h>
#include <Rdefines.h>
#include <string.h>
SEXP helloC1(SEXP greeting) {
int i, vectorLength, stringLength;
SEXP result;
PROTECT(greeting = AS_CHARACTER(greeting));
vectorLength = LENGTH(greeting);
PROTECT(result = NEW_INTEGER(vectorLength));
for (i=0; i<vectorLength; i++) {
stringLength = strlen(CHAR(STRING_ELT(greeting, i)));
INTEGER(result)[i] = stringLength;
}
UNPROTECT(2);
return(result);
}
SEXP 问候作为参数传入,作者立即保护它。但是,从 Writing R Extensions 我注意到了这一点:
因此,为了健全性检查,有人可以告诉我这些作者保护传入参数的代码示例是否可以被修剪?如果是这种情况,我将能够使我的代码更清晰。
最佳答案
输入参数不需要受到保护,但您有一点误解—— protected 不是输入参数 greeting
,而是由 SEXP
生成的新 AS_CHARACTER(greeting)
受到保护。
这有点令人困惑,因为 greeting
变量会立即重新分配,但实际上您现在有 greeting
指向一个全新的 SEXP
,而这个新对象需要垃圾收集器的保护。
关于c - 是否有必要保护 .Call 参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39791553/