2015-11-23 3 views
3

Где можно найти определения для этих двух функций. Grepping для их имени приносит только объявления, но я не могу найти их реализацию в исходном коде.Определения Rf_error и Rf_warning

ответ

6

Предположительно вы ищете определения функции кода C. То, что я обычно делаю при поиске определений, - это поиск по всем файлам для имени функции без Rf_, но с типом возврата. Например, для Rf_error я бы искал void error. В этом случае вы довольно быстро получить (от src/main/[email protected], для 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 того же файла.

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 за полезные указатели. Любые ошибки - мои.

+0

Спасибо Joshua. Я знал, что видел этот тип кода в другом месте по поводу Rf_, но отказался от попытки найти его через пару минут. – BrodieG

Смежные вопросы