rtv / Stage

Mobile robot simulator
rtv.github.com/Stage
GNU General Public License v2.0
391 stars 175 forks source link

new c++11 string literal breaks macrodefenitions in stage.hh #64

Closed majorx234 closed 7 years ago

majorx234 commented 8 years ago

get error when compiling: In file included from src/stageros.cpp:38:0: /opt/ros/indigo/lib/cmake/Stage/../../../include/Stage-4.1/stage.hh: In member function ‘virtual void Stg::Ancestor::SetToken(const string&)’: /opt/ros/indigo/lib/cmake/Stage/../../../include/Stage-4.1/stage.hh:625:62: error: unable to find string literal operator ‘operator""m’ with ‘const char [24]’, ‘long unsigned int’ arguments

define PRINT_ERR(m) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", FILE, FUNCTION)

                                                          ^

/opt/ros/indigo/lib/cmake/Stage/../../../include/Stage-4.1/stage.hh:725:2: note: in expansion of macro ‘PRINT_ERR’ PRINT_ERR( "Ancestor::SetToken() called with zero length string. Ignored." ); ^~~~~ /opt/ros/indigo/lib/cmake/Stage/../../../include/Stage-4.1/stage.hh: In member function ‘virtual void Stg::Model::SetToken(const string&)’: /opt/ros/indigo/lib/cmake/Stage/../../../include/Stage-4.1/stage.hh:625:62: error: unable to find string literal operator ‘operator""m’ with ‘const char [24]’, ‘long unsigned int’ arguments

define PRINT_ERR(m) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", FILE, FUNCTION)

                                                          ^

/opt/ros/indigo/lib/cmake/Stage/../../../include/Stage-4.1/stage.hh:2032:2: note: in expansion of macro ‘PRINT_ERR’ PRINT_ERR( "Model::SetToken() called with zero length string. Ignored." ); ^~~~~ make[2]: * [CMakeFiles/stageros.dir/build.make:63: CMakeFiles/stageros.dir/src/stageros.cpp.o] Error 1 make[1]: * [CMakeFiles/Makefile2:805: CMakeFiles/stageros.dir/all] Error 2 make: *\ [Makefile:128: all] Error 2

the problem is that in c++11 new string literals could be defined (e.g. operator ""m) thus the macrodefinitions won't work anymore

solved it with a patch of libstage/stage.hh: @@ -647,46 +647,46 @@ { cont.erase( std::remove( cont.begin(), cont.end(), thing ), cont.end() ); }

// Error macros - output goes to stderr -#define PRINT_ERR(m) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", FILE, FUNCTION) -#define PRINT_ERR1(m,a) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, FILE, FUNCTION)
-#define PRINT_ERR2(m,a,b) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, FILE, FUNCTION) -#define PRINT_ERR3(m,a,b,c) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, c, FILE, FUNCTION) -#define PRINT_ERR4(m,a,b,c,d) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, c, d, FILE, FUNCTION) -#define PRINT_ERR5(m,a,b,c,d,e) fprintf( stderr, "\033[41merr\033[0m: "m" (%s %s)\n", a, b, c, d, e, FILE, FUNCTION) +#define PRINT_ERR(m) fprintf( stderr, "\033[41merr\033[0m: "#m" (%s %s)\n", FILE, FUNCTION) +#define PRINT_ERR1(m,a) fprintf( stderr, "\033[41merr\033[0m: "#m" (%s %s)\n", a, FILE, FUNCTION)
+#define PRINT_ERR2(m,a,b) fprintf( stderr, "\033[41merr\033[0m: "#m" (%s %s)\n", a, b, FILE, FUNCTION) +#define PRINT_ERR3(m,a,b,c) fprintf( stderr, "\033[41merr\033[0m: "#m" (%s %s)\n", a, b, c, FILE, FUNCTION) +#define PRINT_ERR4(m,a,b,c,d) fprintf( stderr, "\033[41merr\033[0m: "#m" (%s %s)\n", a, b, c, d, FILE, FUNCTION) +#define PRINT_ERR5(m,a,b,c,d,e) fprintf( stderr, "\033[41merr\033[0m: "#m" (%s %s)\n", a, b, c, d, e, FILE, FUNCTION)

// Warning macros -#define PRINT_WARN(m) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", FILE, FUNCTION) -#define PRINT_WARN1(m,a) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, FILE, FUNCTION)
-#define PRINT_WARN2(m,a,b) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, FILE, FUNCTION) -#define PRINT_WARN3(m,a,b,c) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, c, FILE, FUNCTION) -#define PRINT_WARN4(m,a,b,c,d) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, c, d, FILE, FUNCTION) -#define PRINT_WARN5(m,a,b,c,d,e) printf( "\033[44mwarn\033[0m: "m" (%s %s)\n", a, b, c, d, e, FILE, FUNCTION) +#define PRINT_WARN(m) printf( "\033[44mwarn\033[0m: "#m" (%s %s)\n", FILE, FUNCTION) +#define PRINT_WARN1(m,a) printf( "\033[44mwarn\033[0m: "#m" (%s %s)\n", a, FILE, FUNCTION)
+#define PRINT_WARN2(m,a,b) printf( "\033[44mwarn\033[0m: "#m" (%s %s)\n", a, b, FILE, FUNCTION) +#define PRINT_WARN3(m,a,b,c) printf( "\033[44mwarn\033[0m: "#m" (%s %s)\n", a, b, c, FILE, FUNCTION) +#define PRINT_WARN4(m,a,b,c,d) printf( "\033[44mwarn\033[0m: "#m" (%s %s)\n", a, b, c, d, FILE, FUNCTION) +#define PRINT_WARN5(m,a,b,c,d,e) printf( "\033[44mwarn\033[0m: "#m" (%s %s)\n", a, b, c, d, e, FILE, FUNCTION)

// Message macros

ifdef DEBUG

-#define PRINT_MSG(m) printf( "Stage: "m" (%s %s)\n", FILE, FUNCTION) -#define PRINT_MSG1(m,a) printf( "Stage: "m" (%s %s)\n", a, FILE, FUNCTION)
-#define PRINT_MSG2(m,a,b) printf( "Stage: "m" (%s %s)\n", a, b, FILE, FUNCTION) -#define PRINT_MSG3(m,a,b,c) printf( "Stage: "m" (%s %s)\n", a, b, c, FILE, FUNCTION) -#define PRINT_MSG4(m,a,b,c,d) printf( "Stage: "m" (%s %s)\n", a, b, c, d, FILE, FUNCTION) -#define PRINT_MSG5(m,a,b,c,d,e) printf( "Stage: "m" (%s %s)\n", a, b, c, d, e,FILE, FUNCTION) +#define PRINT_MSG(m) printf( "Stage: "#m" (%s %s)\n", FILE, FUNCTION) +#define PRINT_MSG1(m,a) printf( "Stage: "#m" (%s %s)\n", a, FILE, FUNCTION)
+#define PRINT_MSG2(m,a,b) printf( "Stage: "#m" (%s %s)\n", a, b, FILE, FUNCTION) +#define PRINT_MSG3(m,a,b,c) printf( "Stage: "#m" (%s %s)\n", a, b, c, FILE, FUNCTION) +#define PRINT_MSG4(m,a,b,c,d) printf( "Stage: "#m" (%s %s)\n", a, b, c, d, FILE, FUNCTION) +#define PRINT_MSG5(m,a,b,c,d,e) printf( "Stage: "#m" (%s %s)\n", a, b, c, d, e,FILE, FUNCTION)

else

-#define PRINT_MSG(m) printf( "Stage: "m"\n" ) -#define PRINT_MSG1(m,a) printf( "Stage: "m"\n", a) -#define PRINT_MSG2(m,a,b) printf( "Stage: "m"\n,", a, b ) -#define PRINT_MSG3(m,a,b,c) printf( "Stage: "m"\n", a, b, c ) -#define PRINT_MSG4(m,a,b,c,d) printf( "Stage: "m"\n", a, b, c, d ) -#define PRINT_MSG5(m,a,b,c,d,e) printf( "Stage: "m"\n", a, b, c, d, e ) +#define PRINT_MSG(m) printf( "Stage: "#m"\n" ) +#define PRINT_MSG1(m,a) printf( "Stage: "#m"\n", a) +#define PRINT_MSG2(m,a,b) printf( "Stage: "#m"\n,", a, b ) +#define PRINT_MSG3(m,a,b,c) printf( "Stage: "#m"\n", a, b, c ) +#define PRINT_MSG4(m,a,b,c,d) printf( "Stage: "#m"\n", a, b, c, d ) +#define PRINT_MSG5(m,a,b,c,d,e) printf( "Stage: "#m"\n", a, b, c, d, e )

endif

// DEBUG macros

ifdef DEBUG

-#define PRINT_DEBUG(m) printf( "debug: "m" (%s %s)\n", FILE, FUNCTION) -#define PRINT_DEBUG1(m,a) printf( "debug: "m" (%s %s)\n", a, FILE, FUNCTION)
-#define PRINT_DEBUG2(m,a,b) printf( "debug: "m" (%s %s)\n", a, b, FILE, FUNCTION) -#define PRINT_DEBUG3(m,a,b,c) printf( "debug: "m" (%s %s)\n", a, b, c, FILE, FUNCTION) -#define PRINT_DEBUG4(m,a,b,c,d) printf( "debug: "m" (%s %s)\n", a, b, c ,d, FILE, FUNCTION) -#define PRINT_DEBUG5(m,a,b,c,d,e) printf( "debug: "m" (%s %s)\n", a, b, c ,d, e, FILE, FUNCTION) +#define PRINT_DEBUG(m) printf( "debug: "#m" (%s %s)\n", FILE, FUNCTION) +#define PRINT_DEBUG1(m,a) printf( "debug: "#m" (%s %s)\n", a, FILE, FUNCTION)
+#define PRINT_DEBUG2(m,a,b) printf( "debug: "#m" (%s %s)\n", a, b, FILE, FUNCTION) +#define PRINT_DEBUG3(m,a,b,c) printf( "debug: "#m" (%s %s)\n", a, b, c, FILE, FUNCTION) +#define PRINT_DEBUG4(m,a,b,c,d) printf( "debug: "#m" (%s %s)\n", a, b, c ,d, FILE, FUNCTION) +#define PRINT_DEBUG5(m,a,b,c,d,e) printf( "debug: "#m" (%s %s)\n", a, b, c ,d, e, FILE, FUNCTION)

else

define PRINT_DEBUG(m)

define PRINT_DEBUG1(m,a)

majorx234 commented 8 years ago

added the diff file, sorry in the comment it looks realy ugly

stage.hh.diff.zip

kartikmohta commented 8 years ago

See #62

xuefengchang commented 7 years ago

which directory should I put the stage.hh.diff file to?

majorx234 commented 7 years ago

you have to apply the patch with the terminal command "patch"! here is a tutorial: http://www.thegeekstuff.com/2014/12/patch-command-examples/ good luck

rtv commented 7 years ago

applied PR for #62 to fix. Thanks.