R_C函式編譯時輸出警告“control reached end of...”的解決方法
阿新 • • 發佈:2018-11-30
解決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)
{
// [email protected]: 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)
{
// [email protected]: 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