D Programming Language 2.0

- Forum
- Wiki
- Search
- Downloads
- Home

Last update Tue Jan 24 10:50:53 2012

# Pragmas

    Pragma:
        pragma ( Identifier )
        pragma ( Identifier , ArgumentList )

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.

Pragmas can appear as either declarations, Pragma DeclarationBlock, or as statements, PragmaStatement.

    pragma(ident);        // just by itself

    pragma(ident) declaration; // influence one declaration

    pragma(ident): // influence subsequent declarations
        declaration;
        declaration;

    pragma(ident) { // influence block of declarations
        declaration;
        declaration;
    }

    pragma(ident) statement; // influence one statement

    pragma(ident) { // influence block of statements
        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.

## Predefined Pragmas

All implementations must support these, even if by just ignoring them:

msg
  Prints a message to the standard error stream 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)
        { ... }
    }

Forums | Comments | D | Search | Downloads | Home
Copyright © 1999-2012 by Digital Mars ®, All Rights Reserved | Page generated by Ddoc.