【问题标题】:Where do I find the definition of Rf_protect() in R's sources?在 R 的源代码中哪里可以找到 Rf_protect() 的定义?
【发布时间】:2015-11-12 08:33:22
【问题描述】:

我正在阅读 R 源代码并尝试了解堆结构。我正在寻找 PROTECT() 的定义,但我已经创建了:

$ grep -rn "#define PROTECT(" *
src/include/Rinternals.h:642:#define PROTECT(s) Rf_protect(s)

然后

$ grep -rn "Rf_protect(" *
src/include/Rinternals.h:803:SEXP Rf_protect(SEXP);
src/include/Rinternals.h:1267:SEXP Rf_protect(SEXP);

但是我没有找到 Rf_protect() 的定义。

谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    Rf_ 前缀是一个常见的习惯用法,它使这个纯 C 代码类似于命名空间。所以你想寻找protect(...)

    /usr/share/R/include/Rinternals.h:#define protect               Rf_protect
    

    考虑到它的“核心”程度,您不妨从src/main 开始,快速的grep -c 将您引导至src/main/memory.c。瞧on lines 3075 to 3081

    SEXP protect(SEXP s)
    {
        if (R_PPStackTop >= R_PPStackSize)
        R_signal_protect_error();
        R_PPStack[R_PPStackTop++] = CHK(s);
        return s;
    }
    

    话虽如此,您可能要注意文件的大部分内容,而不仅仅是这个函数。

    【讨论】:

    • 是的,我当然不只是阅读那个函数。感谢您的回答。
    • 我的意思不是贬低。你似乎知道protect() 的重要性,我只是想“缓冲”这个函数总共出现四行的事实......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多