我在哪里可以找到这两个功能的定义。为他们的名字添加名称只会带来声明,但我无法在源代码中找到他们的实现。
答案 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提供了有用的指示。任何错误都是我的。