[Rcpp-devel] C++11 in Windows R package

Matt D. matdzb at gmail.com
Thu May 29 20:41:53 CEST 2014


On 5/28/2014 23:58, Matteo Fasiolo wrote:
> Dear Rcpp developers,
>
>  I am working on a package <https://github.com/mfasiolo/mvnfast> which 
> uses Rcpp/RcppArmadillo, OpenMP and C++11.
>
> Everything works fine under Linux: the package passes R CMD check 
> --as-cran,
> while tests and vignettes work fine.
>
> I uploaded the package on win-builder, but I keep getting the error at 
> the bottom.
>
> I have included the line CXX_STD = CXX11 in makefile.win as written in 
> "Writing
> R extensions". I have read comments on SO 
> <http://stackoverflow.com/questions/18971177/building-r-package-with-c11-rcpp-on-windows> regarding 
> Rtools not supporting many C++11
> features. Is that the reason for the error or am I missing something?
Hi, it's fixable! :-)

I remember having to do that for RcppArmadillo 0.4.200.0.
Just updated to RcppArmadillo 0.4.300.0 and the issue still appears.

There are two reasons (and thus two quick fixes):

- "\RcppArmadillo\include\armadillo_bits\compiler_setup.hpp" forces the 
C++11 mode even when the compiler only supports experimental C++0x (this 
explains your diagnostic messages);

a simple fix is to comment out the offending preprocessor directives -- 
as in the following:

   //#if defined(__GXX_EXPERIMENTAL_CXX0X__)
   //  #undef  ARMA_USE_CXX11
   //  #define ARMA_USE_CXX11
   //#endif

- "\RcppArmadillo\include\RcppArmadilloConfig.h" tries to detect Windows 
environment and fails (as already noticed).
IMHO it fails for a good reason -- the guaranteed define is `_WIN32` and 
not `WIN32`.

// As Dirk noted the `WIN32` attempt is due to the choice made by R 
implementers in the past. This doesn't change the fact that this choice 
is wrong, IMHO -- the reason is that only the leading underscore (with 
certain capitalization variants, also other names with `_t`, etc.) is 
guaranteed to result in a name that is an implementation-reserved choice 
in C and C++. OTOH, names like `WIN32` are not reserved and the users 
(client code) may feel free to (re)define them as they like -- in 
particular, Windows users may freely `#undef` it, while POSIX users may 
freely `#define` it -- and there's no reason to say they would be 
"wrong" in doing so ;-)
//
// See:
// 
http://stackoverflow.com/questions/662084/whats-the-difference-between-the-win32-and-win32-defines-in-c
// 
http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier

A better fix may be to fix the offending line in 
"RcppArmadilloConfig.h", perhaps to something like the following:
#if defined(WIN32) || defined(_WIN32)

After applying these fixes, an example from 
http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-attributes.pdf (p.6; 
BTW, there's a small typo: using-directive statement is missing a 
semicolon terminator) using RcppArmadillo compiles without issues.

HTH,

Best,

Matt


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20140529/bc872bb7/attachment-0001.html>


More information about the Rcpp-devel mailing list