What does this expression mean, and why does it compile? [duplicate]
It looks like this is a Visual C++ extension to support a particular 'no function defined' idiom. From the warning C4353 page:
// C4353.cpp// compile with: /W1void MyPrintf(void){};#define X 0#if X #define DBPRINT MyPrint#else #define DBPRINT 0 // C4353 expected#endifint main(){ DBPRINT();}
the intention being that DBPRINT
is a no-op. The warning suggests #define DBPRINT __noop
instead, using VC's __noop extension instead.
If you view the assembly listing for your output you'll see the second clause is omitted, even in debug mode.
Guess it was interpreted as
if((1 == 2) || NULL (-4 > 2)) printf("Hello");
where NULL is a function-pointer, by default returning int... What at actually happens in runtime is platform-dependent
Visual Studio 2012 gives you the following warning:
warning C4353: nonstandard extension used: constant 0 as function expression. Use '__noop' function intrinsic instead
it is a non-standard way to insert a "no operation" assembler instruction at that point of expression evaluation