'idiomatic' porting of c and or c++ code that does NULL checking

bearophile via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Aug 23 03:53:03 PDT 2014


ketmar:

> don't use '==' to check for nulls. the right way is:
>
>   if (foo is null) {}
>   if (bar !is null) {}
>
> '==' transforms to opEquals call (see 'operator overloading') 
> and 'is' not.

I use "is" and "!is" for class references and == != for pointers. 
But now I think you are right, and in D it's better to always use 
is and !is for both, to avoid present and future bugs (like when 
a pointer gets replaced by a class reference by successive 
changes in the code).

So the code I've written becomes:

bool initializeSDL()
out {
     assert(.gWindow !is null);
     assert(.gScreenSurface !is null);
} body {
     alias success = bool;

     if (SDL_Init(SDL.init_video) < 0) {
         stderr.writeln("SDL could not initialize! SDL_Error: ",
                        SDL_GetError);
         return success(false);
     } else {
         .gWindow = SDL_CreateWindow("SDL Tutorial",
                                     SDL.qindowpos_undefined,
                                     SDL.windowpos_undefined,
                                     .screen_width,
                                     .screen_height,
                                     SDL.window_shown);

         if (.gWindow is null) {
             stderr.writeln("Window could not be created! 
SDL_Error: ",
                            SDL_GetError);
             return success(false);
         } else {
             .gScreenSurface = SDL_GetWindowSurface(.gWindow);
         }
     }

     return success(true);
}



bool initializeSDL() nothrow
out {
     assert(.gWindow !is null);
     assert(.gScreenSurface !is null);
} body {
     if (SDL_Init(SDL.init_video) < 0) {
         throw new text("SDL could not initialize: ", 
SDL_GetError).SDL_Error;
     } else {
         .gWindow = SDL_CreateWindow("SDL Tutorial",
                                     SDL.qindowpos_undefined,
                                     SDL.windowpos_undefined,
                                     .screen_width,
                                     .screen_height,
                                     SDL.window_shown);

         if (.gWindow is null) {
             throw new text("Window could not be created: ", 
SDL_GetError).SDL_Error;
         } else {
             gScreenSurface = SDL_GetWindowSurface(gWindow);
         }
     }
}


Bye,
bearophile


More information about the Digitalmars-d-learn mailing list