silent extern error (PR#898)
On Sun, 8 Apr 2001, Prof Brian D Ripley wrote:
On Sat, 7 Apr 2001 bellis@hsph.harvard.edu wrote:
Full_Name: Byron Ellis
Version: 1.2.2
OS: all
Submission from: (NULL) (140.247.105.95)
R_ext/Arith.h
#ifdef MAIN
#define extern
#endif
#ifdef __cplusplus
extern "C" {
#endif
these two should be reversed. Its never a problem because builds aren't done
against C++ compilers, but its still an error (just a low priority one).
Sorry, but as __MAIN__ (not MAIN) is only defined in one C module internal to R, why is it an error? It would be an error if there ever was an intention that module was to be in C++, but there is not. The #ifdef __cplusplus constructs are only there to allow the header files to be used in C++ addons, and defining __MAIN__ is *not* part of the API. In short, those two #ifdef's are mutually exclusive, so their order is immaterial. How can one order be an error?
Okay, then it was a simple misunderstanding on my part in the event that you will never attempt to compile R under a compiler in C++ mode and you don't have to worry about it any more.
also, you could change that to
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __MAIN__
#define extern
#elif _MSC_VER
#define extern __dllspec(dllimport)
#endif
with the corresponding change to the #undef region. This would allow people to
develop for R using MSVC++ more easily.
However, *that* would be an error. _MSC_VER may well be defined during the actual compilation of R, and __MAIN__ is only defined in the compilation of main.c. So compilation would fail under VC++ (and other compilers which define _MSC_VER). (It is also possible for _MSC_VER to be defined but not have a value, so is the test what you really meant?)
I personally can't think of a VC++ compiler I've used where _MSC_VER is defined but __declspec(dllimport) is unavailable, except maybe VC++ 1.5 where its been such a long time I can't recall. (Of course, VC++ 1.5 doesn't even RUN under Win2K let alone compile anything :-)) If suppose you could change it to something like #if _MSC_VER >= 1100 if there is such a compiler and that would work as well.
If we intended to make compilation for other C compilers easier we would need to add lines like that to lots of the header files, and for more than one compiler system. However, we don't particularly want to make the use of Arith.h under VC++ easier, as VC++ does not handle IEEE arithmetic correctly! In short, using Arith.h in addons compiled with VC++ is likely to give incorrect results.
Welp, just the two (and putting it above the __cplusplus def) in R_ext/Arith.h and Rinternals.h. If you also toss a __cplusplus statement after the #include's in Rinternals.h it also works in C++ mode (which is missing things like that nasty sizeof() bug).
(We know from past experience that R can be compiled with VC++ (6.0sp3, to be precise) but then fails make check, giving incorrect results in the arithmetic tests and elsewhere.)
Yes, fortunately I'm not using the IEEE arith code--- I'm actually writing non-numerical support libraries and GUI embedding code. I mostly just like to do my development using VC++ (probably because I'm getting lazy, but whatever). Out of curiosity has this been tested with SP4 or 7beta?
-- Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595
Byron Ellis (bellis@hsph.harvard.edu) -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._