www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - C Macro deeper meaning?

reply Andrew Edwards <edwards.ac gmail.com> writes:
If I understand correctly, this piece of code:
     enum NOTUSED(v) do { (void)(1 ? (void)0 : ( (void)(v) ) ); } 
while(0)

can be converted to the following in D:

     void notUsed(T)(T v) { return cast(void)0; };

since it always returns cast(void)0 regardless of the input.

But it cannot be that simple, so what am I missing?

Thanks,
Andrew Edwards
Jan 30 2016
next sibling parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Sunday, 31 January 2016 at 02:58:28 UTC, Andrew Edwards wrote:
 But it cannot be that simple, so what am I missing?
I'm guessing the macro was there in C to silence compiler warnings about not using a return value. So I think your translation is ok: NOTUSED(somefunction(....)); still calls the function, so the behavior is the same. If I'm right, the macro was just about discarding the return value in such a way as to tell the compiler warning / lint program that you intentionally wanted to ignore it.
Jan 30 2016
parent Andrew Edwards <edwards.ac gmail.com> writes:
On Sunday, 31 January 2016 at 03:13:46 UTC, Adam D. Ruppe wrote:
 On Sunday, 31 January 2016 at 02:58:28 UTC, Andrew Edwards 
 wrote:
 But it cannot be that simple, so what am I missing?
I'm guessing the macro was there in C to silence compiler warnings about not using a return value. So I think your translation is ok: NOTUSED(somefunction(....)); still calls the function, so the behavior is the same. If I'm right, the macro was just about discarding the return value in such a way as to tell the compiler warning / lint program that you intentionally wanted to ignore it.
Okay, got it. Much appreciated.
Jan 30 2016
prev sibling next sibling parent Alex Parrill <initrd.gz gmail.com> writes:
On Sunday, 31 January 2016 at 02:58:28 UTC, Andrew Edwards wrote:
 If I understand correctly, this piece of code:
     enum NOTUSED(v) do { (void)(1 ? (void)0 : ( (void)(v) ) ); 
 } while(0)

 can be converted to the following in D:

     void notUsed(T)(T v) { return cast(void)0; };

 since it always returns cast(void)0 regardless of the input.

 But it cannot be that simple, so what am I missing?

 Thanks,
 Andrew Edwards
Might want to change the function argument to `ref T v`, as struct postblits might run otherwise. Probably no reason to `return` either.
Jan 31 2016
prev sibling parent Kagamin <spam here.lot> writes:
On Sunday, 31 January 2016 at 02:58:28 UTC, Andrew Edwards wrote:
     void notUsed(T)(T v) { return cast(void)0; };

 since it always returns cast(void)0 regardless of the input.

 But it cannot be that simple, so what am I missing?
Now notUsed has an unused parameter v.
Feb 01 2016