[Rd] Using long long types in C++
romain at r-enthusiasts.com
romain at r-enthusiasts.com
Fri Sep 20 00:51:52 CEST 2013
Hello,
In Rcpp we'd like to do something useful for types such as long long
and unsigned long long.
For example, supporting our usual wrap construct. We'd like to be able
to "wrap" a long long, or perhaps a std::vector<long long> so that it is
returned to the R side in something meaningful (we are considering
several options like loosing some precision and returning an int,
loosing a bit less precision and returning a double or use bit shifting
tricks and do something compatible with the bit64 package).
To do this, we try to be careful and hide the code behind these two PP
tests:
#if defined(__GNUC__) && defined(__LONG_LONG_MAX__)
which tests for gcc compatible (includes clang) compiler and the
availability of the long long type.
Now this is not enough and we also have to use __extension__ to disable
warnings that are emitted by -pedantic. So we have something like this:
#if defined(__GNUC__) && defined(__LONG_LONG_MAX__)
__extension__ typedef long long int rcpp_long_long_type;
__extension__ typedef unsigned long long int rcpp_ulong_long_type;
#define RCPP_HAS_LONG_LONG_TYPES
#endif
and for the rest of what we do with these types, we use
rcpp_long_long_type and rcpp_ulong_long_type and hide the code behind
#if defined(RCPP_HAS_LONG_LONG_TYPES)
But apparently this is still not enough and on some versions of gcc
(e.g. 4.7 something), -pedantic still generates the warnings unless we
also use -Wno-long-long
Dirk tells me that the fact that these warnings show up means that it
would not be accepted in CRAN. I understand that -pedantic is useful for
finding potential portability problems, but in that case I believe
everything is done to isolate the use of long long to a situation where
we know we can use it given that we test for a compiler (gcc) and its
known way to check for existence of long long: __LONG_LONG_MAX__
What are my options here ?
Romain
More information about the R-devel
mailing list