Skip to content

R_ext/Altrep.h should be more C++-friendly

5 messages · Michael Sannella, Luke Tierney, Gabriel Becker +1 more

#
I am not able to #include "R_ext/Altrep.h" from a C++ file.  I think
it needs two changes:

1. add the same __cplusplus check as most of the other header files:
    #ifdef  __cplusplus
    extern "C" {
    #endif
        ...
    #ifdef  __cplusplus
    }
    #endif

2. change the line
    R_new_altrep(R_altrep_class_t class, SEXP data1, SEXP data2);
 to
    R_new_altrep(R_altrep_class_t cls, SEXP data1, SEXP data2);
 since C++ doesn't like an argument named 'class'

  ~~ Michael Sannella
#
Thanks for the suggestion. Committed in R_devel.

Best,

luke
On Mon, 8 Oct 2018, Michael Sannella wrote:

            

  
    
#
Michael,

Thanks for reaching out. This was brought up by Romaine Francois offline to
me as well. What he does as a workaround is


#define class klass
extern "C" {
  #include <R_ext/Altrep.h>
}
#undef class

While we consider changing Altrep.h, the above should work for you  in the
immediate term.

Let me know if it doesn't.

~G





On Mon, Oct 8, 2018 at 4:17 PM, Michael Sannella via R-devel <
r-devel at r-project.org> wrote:

            

  
    
#
I successfully use this workaround in this package: https://github.com/romainfrancois/altrepisode

(which is just my way to get familiar with altrep, nothing serious)

  
  
#
Thank you, 

I updated my example package so that it works with both. https://github.com/romainfrancois/altrepisode/blob/96af0548a9ecc08701d119ea427e16940a82882b/src/altrepisode.h <https://github.com/romainfrancois/altrepisode/blob/96af0548a9ecc08701d119ea427e16940a82882b/src/altrepisode.h>

We have to do something like this unless we depend on R 3.6.0: 

#if R_VERSION < R_Version(3, 6, 0)
  #define class klass
  extern "C" {
    #include <R_ext/Altrep.h>
  }
  #undef class
#else
  #include <R_ext/Altrep.h>
#endif

Romain