Rf_error和Rf_warning定义

时间:2015-11-23 00:13:44

标签: r

我在哪里可以找到这两个功能的定义。为他们的名字添加名称只会带来声明,但我无法在源代码中找到他们的实现。

2 个答案:

答案 0 :(得分:7)

据推测,您正在寻找C代码函数定义。我在寻找定义时通常会做的是在所有文件中搜索函数名称而不使用Rf_但返回类型。例如,对于Rf_error,我会搜索void error。在这种情况下,您很快就会得到(来自src/main/errors.c@758,对于R版本3.2.2):

void error(const char *format, ...)
{
    char buf[BUFSIZE];
    RCNTXT *c = R_GlobalContext;

    va_list(ap);
    va_start(ap, format);
    Rvsnprintf(buf, min(BUFSIZE, R_WarnLength), format, ap);
    va_end(ap);
    /* This can be called before R_GlobalContext is defined, so... */
    /* If profiling is on, this can be a CTXT_BUILTIN */
    if (c && (c->callflag & CTXT_BUILTIN)) c = c->nextcontext;
    errorcall(c ? c->call : R_NilValue, "%s", buf);
}

Rf_warning在同一文件的第262行定义。

答案 1 :(得分:4)

请注意src/include/R_ext/Error.h

中的以下几行
#ifndef R_NO_REMAP
#define error Rf_error
#define warning Rf_warning
#endif

R_NO_REMAP通常没有定义,因此这意味着宏error会扩展为Rf_error。因此,在包含Error.h的文件中,预处理器会将error的实例替换为Rf_error

所以你需要搜索具有相同返回类型和参数的函数。正如BrodieG在他的回答中指出的那样,这些函数通常(总是?)具有相同的名称,但没有Rf_前缀。

感谢Duncan Murdoch提供了有用的指示。任何错误都是我的。