Have macro 'return' a value

#define CStrNullLastNL(str) ({ \
    char* nl=strrchr(str,'\n');\
    if(nl){*nl=0;} \
    nl; \
})

should work.

Edit: ... in GCC.


Macro's don't return values. Macros tell the preprocessor to replace whatever is after the #define with whatever is after the thing after the #define. The result has to be valid C++.

What you're asking for is how to make the following valid:

func( {char* nl=strrchr(str,'\n'); if(nl){*nl=0;}} );

I can't think of a good way to turn that into something valid, other than just making it a real function call. In this case, I'm not sure why a macro would be better than an inline function. That's seems to be what you're really asking for.


For a macro to "return a value", the macro itself has to be an expression. Your macro is a statement block, which cannot evaluate to an expression.

You really ought to write an inline function. It will be just as fast and far more maintainable.