CPP is a C preprocessor, but it is common to use it in Haskell. That leads to a number of issues.
 It can mess with haskell code.
#CPP doesn’t understand Haskell code, instead it assumes C code. It is free to remove insignificant (for C, not for Haskell) whitespace, expand macros in Haskell comments and strings or mess with identifiers that contain ' or #.
 It leads to unnecessary recompilation.
Every time you change your .cabal file, e.g. add new module, or update dependencies, cabal regenerates cabal-macros.h file. Then the recompilation checker pessimistically decides to recompile all modules with CPP enabled.
 It makes automatic code analyzing and transforming harder.
#haskell 
http://blog.haskell-exists.com/yuras/posts/stop-abusing-cpp-in-haskell.html