版权声明:本文为博主原创文章,未经博主允许不得转载。(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved) https://blog.csdn.net/S_gy_Zetrov/article/details/84639198
解决R包开发过程中遇到的control reaches end of non-void function
警告(错误)
本文很短,主要是针对一个具体的警告进行举例解决。
问题背景
本文是记录我之前在开发R包(未发布)的时候遇到的一个警告,以及解决方案,主要目的是日常笔记,其次是为了给遇到同样问题的朋友提供可行的思路。
问题描述
在R包开发时,前端R代码调用的底层backend C代码中遇到带有SEXP
指针返回值的函数报错,具体警告:control reaches end of non-void function
输入如下:
mi.binary.c:372:1: warning: control reaches end of non-void function [-Wreturn-type]
警告内容解释
这条警告的直接翻译是控制到达非void函数的结尾。就是说编译器发现一些本应带有返回值的函数在到达该函数结尾后并没有返回任何值。这时候,最好的操作就是检查一下是否每个控制流都具体编写了有返回值。
以我的R包的部分backend C代码为例:
SEXP num2binaryR (SEXP Rdata, SEXP RvarNum1, SEXP Rncols, SEXP Rnrows)
{
// dev3@branch: backend for R numeric matrix to C 0/1 array transformation
const int *rdata;
const int *nrows, *ncols;
const int *varNum1;
PROTECT(Rdata = AS_INTEGER(Rdata));
PROTECT(RvarNum1 = AS_INTEGER(RvarNum1));
PROTECT(Rnrows= AS_INTEGER(Rnrows));
PROTECT(Rncols= AS_INTEGER(Rncols));
rdata = INTEGER_POINTER(Rdata);
varNum1 = INTEGER_POINTER(RvarNum1);
nrows= INTEGER_POINTER(Rnrows);
ncols= INTEGER_POINTER(Rncols);
num2binary(rdata, *varNum1, *ncols, *nrows);
UNPROTECT(4);
}
可以看到编译器输出警告的原因是因为函数num2binaryR
最后并没有返回SEXP类型的值。故解决方法是将SEXP
改为void
。
void num2binaryR (SEXP Rdata, SEXP RvarNum1, SEXP Rncols, SEXP Rnrows)
{
// dev3@branch: backend for R numeric matrix to C 0/1 array transformation
const int *rdata;
const int *nrows, *ncols;
const int *varNum1;
PROTECT(Rdata = AS_INTEGER(Rdata));
PROTECT(RvarNum1 = AS_INTEGER(RvarNum1));
PROTECT(Rnrows= AS_INTEGER(Rnrows));
PROTECT(Rncols= AS_INTEGER(Rncols));
rdata = INTEGER_POINTER(Rdata);
varNum1 = INTEGER_POINTER(RvarNum1);
nrows= INTEGER_POINTER(Rnrows);
ncols= INTEGER_POINTER(Rncols);
num2binary(rdata, *varNum1, *ncols, *nrows);
UNPROTECT(4);
}
(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
visitor tracker