| Thread overview | ||||||
|---|---|---|---|---|---|---|
| 
 | 
| March 02, 2007comparing 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, 2007Re: 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, 2007Re: 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, 2007Re: 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
  Permalink
Permalink Reply
Reply