[Rcpp-devel] long long

Romain Francois romain at r-enthusiasts.com
Thu Sep 19 14:18:37 CEST 2013


(rebrand as a Rcpp-devel question)

Le 19/09/13 13:58, Romain Francois a écrit :
> Hello,
>
> I'm trying to understand these:
>
> #ifdef __GNUC__
> #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined (__clang__) &&
> defined(__LP64__))
> #ifdef __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
> #endif
> #endif
>
>
> On my system, I have :
>
>  > demangle( "long long" )
> [1] "long long"
>  > sizeof( "long long" )
> 8 bytes (64 bits)
>
> So I do have a long long type. But I'm not running with c++0x or clang,
> so I don't get the macro defined:
>
>  > Rcpp:::areMacrosDefined( "RCPP_HAS_LONG_LONG_TYPES" )
> RCPP_HAS_LONG_LONG_TYPES
>                     FALSE
>
> That feels wrong. Maybe we could use some sort of configure script with
>
> AC_CHECK_SIZEOF(long long)
>
> I don't get why we have this line:
>
> #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined (__clang__) &&
> defined(__LP64__))
>
> Isn't having __LONG_LONG_MAX__ enough ?
>
> long long has nothing to do with C++11.
>
> Romain

And if compile this file with -Wall -pedantic. I don't get issues:

#include <Rcpp.h>
using namespace Rcpp ;

__extension__ typedef long long int rcpp_long_long_type;

// [[Rcpp::export]]
int foo(){
	rcpp_long_long_type x = 2 ;
	return (int)x;
}


But if I remove the __extension__ thing, I get the warning:

$ RcppScript longlong.cpp
longlong.cpp:4: error: ISO C++ does not support ‘long long’
make: *** [longlong.o] Error 1
llvm-g++-4.2 -arch x86_64 
-I/Library/Frameworks/R.framework/Resources/include -DNDEBUG 
-I/usr/local/include 
-I"/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include" 
   -Wall -pedantic -fPIC  -mtune=core2 -g -O2  -c longlong.cpp -o longlong.o
Erreur dans sourceCpp(file) : Error 1 occurred building shared library.
Exécution arrêtée

-pedantic gives us the warning when it sees us writing long long, but if 
we just hide it behind __extension__ it does not complain no more.


So we should be able to just use __LONG_LONG_MAX__ and if people want to 
use long long in their code, they use rcpp_long_long_type or maybe we 
alias it to something sweater (LONG_LONG) perhaps ?


Romain

-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30



More information about the Rcpp-devel mailing list