What are analogs of "#ifdef", "#ifndef", "#else", "#elif", "#define", "#undef" in D programming language?

d, preprocessor

Solution

Update: The best answer is already on dlang.org: http://dlang.org/pretod.html .

D has no preprocessor. Instead it gives powerful compile-time evaluation and introspection capabilities.

Here is a simple list of typical C/C++ to D translations, with links to relevant documents:

C/C++: `#ifdef`, `#ifndef`, `#else`, `#elif`

D: `version` [link]

C/C++: `#if <condition>`

D: `static if` [link]

C/C++: `#define`

D: D translation depends on the case.

Simple C/C++ define like `#define FOO` is translated to D's "version". Example: `version = FOO`

Code like `#define BAR 40` is translated to the following D code: `enum BAR 40` or in rare cases you may need to use the `alias`.

Complex defines like `#define GT_CONSTRUCT(depth,scheme,size) \ ((depth) | (scheme) | ((size) << GT_SIZE_SHIFT))` are translated into D's templates:

// Template that constructs a graphtype
template GT_CONSTRUCT(uint depth, uint scheme, uint size) {
  // notice the name of the const is the same as that of the template
  const uint GT_CONSTRUCT = (depth | scheme | (size << GT_SIZE_SHIFT));
}

(Example taken from the D wiki)

C/C++: `#undef`

D: There is no adequate translation that I know of

Problem

In C/C++ we have preprocessor directives (see title of the question). What is the analog of them in D language? And how to detect operating system type (Windows, Linux, Mac OS X, FreeBSD, ...) and processor type (e.g.: 32 or 64 bits) at compile-time?

Original source