yihui 最近 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
Jiena 试试把 这行 里的 rmd_init_renderer_list() 改成 rmd_init_renderer_list(void) 在本地测测看警告有没有消失。 参考这个 SO 。 在这个例子里,c语言里rmd_init_renderer_list()意思是能接受任意参数, 而rmd_init_renderer_list(void) 的意思是不接受任何参数,我估计这个警告是想让你明确rmd_init_renderer_list的心意是不接受任何参数。
yihui Jiena 谢谢!那个帖子我也搜到过,不过没去试。刚试了一下,确实是能解决掉两个警告。然后机缘巧合之下,我刚好看到另一个包也在修正同样的问题,所以抄起键盘就抄了一下他的作业。虽然我不是很懂,但感觉是以前函数的参数类型声明可以写在小括号之外,现在必须挪进去了。 另外,复现问题的办法是把 PKG_CFLAGS=-Wstrict-prototypes 写入 ~/.R/Makevars 中,然后再运行 R CMD build 就可以看到那些警告信息了(否则默认情况下这些警告不会出现)。这是我作为一个 C 瞎子凭几年前的记忆摸出来的路……
yihui shrektan 是的,一共有两个问题,一个是 Jiena 说的,没有参数的函数应该加上 void 作为参数,另一个就是你说的,参数定义应该放在括号里。 关于第一个问题,我们厂有职工提出了异议:https://stat.ethz.ch/pipermail/r-package-devel/2022q4/008589.html 不过不知道 CRAN 是否会理会这建议。
shrektan 好奇搜了下,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/
yihui 因为不堪其扰,我终于手起刀落把所有的 C 代码都删了,现在 markdown 包构建在 commonmark 之上。美国中部时间的今天下午一点半我会讲一讲这个重获新生的十年老包子:https://yihui.org/en/2023/01/minimal-r-markdown/