开发者

C++ macro without spaces

开发者 https://www.devze.com 2023-03-28 11:06 出处:网络
I need a macro to expand to a c++ comment, is that possible? I\'ve got this: #define SLASH(x,y) x y #define OUT SLASH(/,/)

I need a macro to expand to a c++ comment, is that possible?

I've got this:

#define SLASH(x,y) x y
#define OUT SLASH(/,/)

int main(int argc, char *argv[])
{
  OUT << "text";
  return 0;
}

And need to expand to this:

{
  // << "text";
  return 0;
}

I've also tried this开发者_Python百科:

#define SLASH(x) /x
#define OUT SLASH(/)

But the result is still the same:

int main(int argc, char *argv[])
{
  / / << "text";
  return 0;
}


No it's not possible because in C++ comments are removed before macros are expanded.

(See 2.1 of the standard, comment removal happens in phase 3, macro expansion in phase 4.)


What about replacing it with a function object that does nothing instead?

static class NullOutput { 
public:
    template <typename T> 
    const NullOutput &operator<<(T arg) const { 
        return *this; 
    }
} NullOutputObj;

#define OUT NullOutputObj

The net result is that the object is removed from the code and replaced by inlined template expansions, that are then optimized out as they do nothing. Result is absolutely no code overhead.


As others mentioned there is no guaranteed way to define the kind of macro you are looking for. Other ways to achieve results that are similar to what you seem to be trying to achieve are wrapping your output statement in a conditional block or define a custom output stream that just discarded all output. The two approaches may even be combined so that behaviour could be switched by changing a single macro definition.


Comments are removed from the source code before the preprocessor runs. So you cannot do this.


an alternate to what you want to achieve would be this :

http://donjaffer.blogspot.in/2012/09/dprintf-debug-macro-in-c.html

#define DEBUG   // comment if you do not want the debug statments to appear.

#ifdef DEBUG
#define DPRINTF(fmt, ...) \
    do { printf("my_file: " fmt, ## __VA_ARGS__); } while (0)
#else
#define DPRINTF(fmt, ...) \
    do { } while (0)
#endif

wherever you are trying to print the statements, instead of COUT << you can use

DPRINTF("Your text here\n");
0

精彩评论

暂无评论...
验证码 换一张
取 消