On 28 Jul 2017, at 13:55, Tijl Coosemans <[email protected]> wrote: > > On Thu, 27 Jul 2017 21:42:01 +0000 [email protected] wrote: ... >> In file included from squirrel/squirrel/sqvm.cc:5: >> In file included from /usr/include/c++/v1/math.h:310: >> /usr/include/c++/v1/limits:149:85: error: expected expression >> _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT >> {return type();} >> >> ^ >> squirrel/squirrel/sqobject.h:131:24: note: expanded from macro 'type' >> #define type(obj) ((obj)._type) >> ^ > > Simutrans code defines 'type' as a macro. Shouldn't libc++ headers use > _type or __type or something?
No, the member name 'type' is used in many classes in the C++ standard
library, for example all the traits in <type_traits>. Programs should
not attempt to redefine this, at least not as a macro.
Note that this also doesn't work with libstdc++, e.g.:
$ cat boom.cpp
#define type "nope, this will not work"
#include <type_traits>
and then:
$ g++ -c boom.cpp
boom.cpp:1:14: error: expected unqualified-id before string constant
#define type "nope, this will not work"
^
boom.cpp:1:14: error: expected class-name before string constant
#define type "nope, this will not work"
^
boom.cpp:1:14: error: expected '{' before string constant
boom.cpp:1:14: error: expected class-name before string constant
#define type "nope, this will not work"
^
boom.cpp:1:14: error: expected '{' before string constant
boom.cpp:1:14: error: expected class-name before string constant
#define type "nope, this will not work"
^
boom.cpp:1:14: error: expected '{' before string constant
boom.cpp:1:14: error: expected class-name before string constant
#define type "nope, this will not work"
^
boom.cpp:1:14: error: expected '{' before string constant
boom.cpp:1:14: error: expected unqualified-id before string constant
#define type "nope, this will not work"
^
In file included from boom.cpp:3:0:
/usr/local/lib/gcc6/include/c++/type_traits:212:60: error: template argument 1
is invalid
: public __is_void_helper<typename remove_cv<_Tp>::type>::type
^
/usr/local/lib/gcc6/include/c++/type_traits:212:61: error: expected '{' before
'::' token
: public __is_void_helper<typename remove_cv<_Tp>::type>::type
^~
[...and lots more errors like this...]
-Dimitry
signature.asc
Description: Message signed with OpenPGP
