^ 显然,Rcpp 有NDEBUG
自己定义的习惯,即使不是我自己定义的。
m@m-X555LJ:~/wtfdir$ cat WTF.r
#!/usr/bin/Rscript
library(Rcpp)
sourceCpp("WTF.cpp")
m@m-X555LJ:~/wtfdir$ cat WTF.cpp
#ifdef NDEBUG
#error WTF I did not define this
#endif
m@m-X555LJ:~/wtfdir$ ./WTF.r
WTF.cpp:2:2: error: #error WTF I did not define this
#error WTF I did not define this
^~~~~
make: *** [WTF.o] Error 1
g++ -I"/usr/share/R/include" -DNDEBUG -I"/home/m/R/x86_64-pc-linux-gnu-library/3.5/Rcpp/include" -I"/home/m/wtfdir" -fpic -g -O2 -fdebug-prefix-map=/build/r-base-3U0YWo/r-base-3.5.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c WTF.cpp -o WTF.o
/usr/lib/R/etc/Makeconf:172: recipe for target 'WTF.o' failed
Error in sourceCpp("WTF.cpp") : Error 1 occurred building shared library.
Execution halted
m@m-X555LJ:~/wtfdir$
我链接的 SO 问题的答案解释了(a)禁止调用assert
上传到 CRAN 的包,因为(b)C++ 代码不应该停止 R 代码,(c)我应该抛出异常,这些异常被rcpp。
然而:
- 我不想将我的代码上传到 CRAN;相反,我正在编写代码供自己使用;
- 即使我希望将它上传到 CRAN,我也可以自己编译它而不
NDEBUG
用于测试目的,然后NDEBUG
在上传到 CRAN 之前定义; - 由于 R 代码和 C++ 代码都是我自己为相同目的编写的(并且我认为它们都是同一个程序),如果检测到其中任何部分的错误,我实际上希望整个程序崩溃;如果 C++ 代码出错,继续运行 R 代码对我来说毫无意义;
- 因为我不知道
NDEBUG
会被定义,所以我已经在我的代码中放了很多s 并且还通过包装在s 中assert
打印诊断信息;这些显然不起作用;std::cerr
#ifndef NDEBUG
- 我不想无条件地抛出异常,因为有些
assert
s 计算量很大; - 截至目前,我的 C++ 代码仍然会破坏我的 R 代码,因为它崩溃了,我正在尝试调查这个问题,但我不能,因为我的诊断不起作用。
有没有办法让 Rcpp 停止定义NDEBUG
?还是我应该简单地删除所有asserts
依赖的东西NDEBUG
并切换到抛出异常并停止抱怨?