From romain at r-enthusiasts.com  Fri Sep 20 00:51:52 2013
From: romain at r-enthusiasts.com (romain at r-enthusiasts.com)
Date: Fri, 20 Sep 2013 00:51:52 +0200
Subject: [Rd] Using long long types in C++
Message-ID: <9df9f69d52dfdddccbf8e32f18dd227a@r-enthusiasts.com>

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



[Rd] Using long long types in C++
romain at r-enthusiasts.com