What's a portable way to implement no-op statement in C++?
The simplest no-op is just having no code at all:
#define noop
Then user code will have:
if (condition) noop; else do_something();
The alternative that you mention is also a no-op: (void)0;
, but if you are going to use that inside a macro, you should leave the ;
aside for the caller to add:
#define noop (void)0
if (condition) noop; else do_something();
(If ;
was part of the macro, then there would be an extra ;
there)
I suspect that it might trigger warnings on some compilers
Unlikely, since ((void)0)
is what the standard assert
macro expands to when NDEBUG
is defined. So any compiler that issues warnings for it will issue warnings whenever code that contains asserts is compiled for release. I expect that would be considered a bug by the users.
I suppose a compiler could avoid that problem by warning for your proposal (void)0
while treating only ((void)0)
specially. So you might be better off using ((void)0)
, but I doubt it.
In general, casting something to void, with or without the extra enclosing parens, idiomatically means "ignore this". For example in C code that casts function parameters to void
in order to suppress warnings for unused variables. So on that score too, a compiler that warned would be rather unpopular, since suppressing one warning would just give you another one.
Note that in C++, standard headers are permitted to include each other. Therefore, if you are using any standard header, assert
might have been defined by that. So your code is non-portable on that account. If you're talking "universally portable", you normally should treat any macro defined in any standard header as a reserved identifier. You could undefine it, but using a different name for your own assertions would be more sensible. I know it's only an example, but I don't see why you'd ever want to define assert
in a "universally portable" way, since all C++ implementations already have it, and it doesn't do what you're defining it to do here.
How about do { } while(0)
? Yes it adds code, but I'm sure most compilers today are capable of optimizing it away.