Pragmas
Pragma:
pragma ( Identifier )
pragma ( Identifier , ExpressionList )
Pragmas are a way to pass special information to the compiler
and to add vendor specific extensions to D.
Pragmas can be used by themselves terminated with a ';',
they can influence a statement, a block of statements, a declaration, or
a block of declarations.
pragma(ident);
pragma(ident) declaration;
pragma(ident): declaration;
declaration;
pragma(ident) { declaration;
declaration;
}
pragma(ident) statement;
pragma(ident) { statement;
statement;
}
The kind of pragma it is is determined by the
Identifier.
ExpressionList is a comma-separated list of
AssignExpressions. The
AssignExpressions must be
parsable as expressions, but what they mean semantically
is up to the individual pragma semantics.
All implementations must support these, even if by just ignoring
them:
- msg
- Prints a message while compiling, the AssignExpressions must
be string literals:
pragma(msg, "compiling...");
- lib
- Inserts a directive in the object file to link in the library
specified by the AssignExpression.
The AssignExpressions must be a string literal:
pragma(lib, "foo.lib");
- startaddress
- Puts a directive into the object file saying that the
function specified in the first argument will be the
start address for the program:
void foo() { ... }
pragma(startaddress, foo);
This is not normally used for application level programming,
but is for specialized systems work.
For applications code, the start address is taken care of
by the runtime library.
Vendor Specific Pragmas
Vendor specific pragma
Identifiers can be defined if they
are prefixed by the vendor's trademarked name, in a similar manner
to version identifiers:
pragma(DigitalMars_funky_extension) { ... }
Compilers must diagnose an error for unrecognized
Pragmas,
even if they are vendor specific ones. This implies that vendor
specific pragmas should be wrapped in version statements:
version (DigitalMars)
{
pragma(DigitalMars_funky_extension) { ... }
}