• R语言已解决
  • 求助:a function declaration without a prototype is deprecated in all versions of C

最近 markdown 包的检查开始出现如下警告消息:https://cran.r-project.org/web/checks/check_results_markdown.html

./Rmarkdown.h:32:35: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]
Rmarkdown.c:179:28: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]
./html_blocks.h:90:1: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
./html_blocks.h:144:1: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]

详情参见:
https://www.r-project.org/nosvn/R.check/r-devel-linux-x86_64-debian-clang/markdown-00install.html
https://www.r-project.org/nosvn/R.check/r-devel-linux-x86_64-debian-gcc/markdown-00install.html

这种 C 语言问题对我来说都是天书,不知如何修正,求壮士们指条生路。谢谢!

源代码在 src 文件夹下:https://github.com/rstudio/markdown

试试把 这行 里的 rmd_init_renderer_list() 改成 rmd_init_renderer_list(void) 在本地测测看警告有没有消失。

参考这个 SO

在这个例子里,c语言里rmd_init_renderer_list()意思是能接受任意参数, 而rmd_init_renderer_list(void) 的意思是不接受任何参数,我估计这个警告是想让你明确rmd_init_renderer_list的心意是不接受任何参数。

    Jiena 谢谢!那个帖子我也搜到过,不过没去试。刚试了一下,确实是能解决掉两个警告。然后机缘巧合之下,我刚好看到另一个包也在修正同样的问题,所以抄起键盘就抄了一下他的作业。虽然我不是很懂,但感觉是以前函数的参数类型声明可以写在小括号之外,现在必须挪进去了。

    另外,复现问题的办法是把 PKG_CFLAGS=-Wstrict-prototypes 写入 ~/.R/Makevars 中,然后再运行 R CMD build 就可以看到那些警告信息了(否则默认情况下这些警告不会出现)。这是我作为一个 C 瞎子凭几年前的记忆摸出来的路……

    6 天 后

    好奇搜了下,c的函数一般是这种形式:

    int foo(double x) {
        ...
    }

    但也可以写成这种形式:

    int foo(x)
    double x;
    {
        ...
    }

    第二种形式被称作”K&R style function definition“,已经被deprecated。

    所以,把.c或者.h文件里面,相关的函数定义形式换成第一种,就是解决方案啦。

    Reference: https://jameshfisher.com/2016/11/27/c-k-and-r/

      3 个月 后