The syntax:
#include <stdio.h>is expressed in D as:
import stdio;
struct Foo { align (4): // use 4 byte alignment ... }
#define VALUE 5In D:
const int VALUE = 5;
#ifndef STDIO_H #define STDIO_H 1 ... #endif // STDIO_HIn D:
import stdio;
int flags: #define FLAG_X 0x1 #define FLAG_Y 0x2 #define FLAG_Z 0x4 ... flags |= FLAGS_X;In D:
enum FLAGS { X = 0x1, Y = 0x2, Z = 0x4 }; FLAGS flags; ... flags |= FLAGS.X;
#if UNICODE #define dchar wchar_t #define TEXT(s) L##s #else #define dchar char #define TEXT(s) s #endif ... dchar h[] = TEXT("hello");In D:
import dchar; // contains appropriate typedef for dchar ... dchar[] h = "hello";D's optimizer will inline the function, and will do the conversion of the string constant at compile time.
#if PROTOTYPES #define P(p) p #else #define P(p) () #endif int func P((int x, int y));D doesn't have legacy compilers, and so doesn't need legacy support. (yet!)
#define INT intIn D:
typealias int INT;
#define EXTERN extern #include "declations.h" #undef EXTERN #define EXTERN #include "declations.h"In declarations.h:
EXTERN int foo;In D, the declaration and the definition are the same, so there is no need to muck with the storage class to generate both a declaration and a definition from the same source.
#define X(i) ((i) = (i) / 3)In D:
int X(int i) { return i = i / 3; }The compiler optimizer will inline it; no efficiency is lost.
#define assert(e) ((e) || _assert(__LINE__, __FILE__))In D, assert() is a built-in expression primitive. Giving the compiler such knowledge of assert() also enables the optimizer to know about things like the _assert() function never returns.
#ifndef _CRTAPI1 #define _CRTAPI1 __cdecl #endif #ifndef _CRTAPI2 #define _CRTAPI2 __cdecl #endif int _CRTAPI2 func();D determines the optimal calling convention for you, so there is no need to override the default or to fiddle with it with macros.
#define LPSTR char FAR *D doesn't support 16 bit code or mixed pointer sizes, and so the problem is just irrelevant. Of course, this problem may return with mixed 64 bit and 32 bit code.