How to use #ifdef WIN32

Neil Mitchell ndmitchell at
Thu Dec 20 20:16:40 EST 2007

Hi Jim

> I want to switch code on the OS but this always goes through to the #else (on
> windows or elsewhere):
> {-# OPTIONS -cpp #-}
> #ifdef WIN32
> main = putStrLn "hello windows"
> #else
> main = putStrLn "hello something else"
> #endif
> Does this depend on a Makefile setting WIN32, or should there be something
> predefined?


#if defined(mingw32_HOST_OS) || defined(__MINGW32__)



If you want to test for Windows you have to ask whether an unrelated
system is installed on your machine. Even if it isn't, you still have
to test this value. This is what I call a "bug".

You might also want to use System.Info.os and test this value
dynamically rather than as a preprocessor, that keeps both code
branches type checking and probably isn't much more expensive at
runtime. Guess what the value of  "os" returns on Windows? (hint: its
ill-typed, being not an operating system)




More information about the Glasgow-haskell-users mailing list