Thread overview | ||||||
---|---|---|---|---|---|---|
|
March 02, 2007 comparing typedefed type to null | ||||
---|---|---|---|---|
| ||||
In writing code against the Mac OS X Carbon API, I often have a need to do this: struct __Foo {}; typedef Foo* FooRef; typedef FooRef BarRef; { BarRef br = ...; FooRef fr = ...; if (br == null) {} // complain if (fr == null) {} ok GDC 0.22/DMD 1.004 complains about the comparison to br: "Error: incompatible types for ((br) == (null)): 'BarRef' and 'void*' I can avoid it by aliasing BarRef instead of typedefing it, but I have the need to allow a BarRef to be passed to FooRef parameters, but not the other way around. The typedef gives me that. |
March 02, 2007 Re: comparing typedefed type to null | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rick Mann | Am 02.03.2007, 01:40 Uhr, schrieb Rick Mann <rmann-d-lang@latencyzero.com>: > In writing code against the Mac OS X Carbon API, I often have a need to do this: > > struct __Foo {}; > typedef Foo* FooRef; > typedef FooRef BarRef; > > { > BarRef br = ...; > FooRef fr = ...; > if (br == null) {} // complain > if (fr == null) {} ok > > GDC 0.22/DMD 1.004 complains about the comparison to br: "Error: incompatible types for ((br) == (null)): 'BarRef' and 'void*' > > I can avoid it by aliasing BarRef instead of typedefing it, but I have the need to allow a BarRef to be passed to FooRef parameters, but not the other way around. The typedef gives me that. You should always use the "is" operator to check for null: ' if (br is null) { ... } -Mike -- Erstellt mit Operas revolutionärem E-Mail-Modul: http://www.opera.com/mail/ |
March 02, 2007 Re: comparing typedefed type to null | ||||
---|---|---|---|---|
| ||||
Posted in reply to mike | mike wrote:
> You should always use the "is" operator to check for null:
>
> ' if (br is null) { ... }
Using == is perfectly valid for pointers (such as those).
--anders
|
March 02, 2007 Re: comparing typedefed type to null | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rick Mann | "Rick Mann" <rmann-d-lang@latencyzero.com> wrote in message news:es7rp3$153q$1@digitalmars.com... > In writing code against the Mac OS X Carbon API, I often have a need to do this: > > struct __Foo {}; > typedef Foo* FooRef; > typedef FooRef BarRef; > > { > BarRef br = ...; > FooRef fr = ...; > if (br == null) {} // complain > if (fr == null) {} ok > > GDC 0.22/DMD 1.004 complains about the comparison to br: "Error: incompatible types for ((br) == (null)): 'BarRef' and 'void*' > > I can avoid it by aliasing BarRef instead of typedefing it, but I have the need to allow a BarRef to be passed to FooRef parameters, but not the other way around. The typedef gives me that. template realType(T) { static if(is(T U == typedef)) alias realType!(U) realType; else alias T realType; } bool isNull(T)(T val) { return (cast(realType!(T))val is null); } void main() { BarRef br; FooRef fr; if (isNull(br)) {} } :S There's got to be a better way.. |
Copyright © 1999-2021 by the D Language Foundation