DCD/constants-gen/pragma.dd

191 lines
5.3 KiB
Plaintext

Ddoc
$(SPEC_S Pragmas,
$(HEADERNAV_TOC)
$(GRAMMAR
$(GNAME Pragma):
$(D pragma) $(D $(LPAREN)) $(I Identifier) $(D $(RPAREN))
$(D pragma) $(D $(LPAREN)) $(I Identifier) $(D ,) $(GLINK2 expression, ArgumentList) $(D $(RPAREN))
)
$(P 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 $(SINGLEQUOTE ;),
they can influence a statement, a block of statements, a declaration, or
a block of declarations.
)
$(P Pragmas can appear as either declarations,
$(I Pragma) $(GLINK2 attribute, DeclarationBlock),
or as statements,
$(GLINK2 statement, 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;
}
-----------------
$(P The kind of pragma it is determined by the $(I Identifier).
$(I ExpressionList) is a comma-separated list of
$(ASSIGNEXPRESSION)s. The $(ASSIGNEXPRESSION)s must be
parsable as expressions, but what they mean semantically
is up to the individual pragma semantics.
)
$(H2 $(LEGACY_LNAME2 Predefined-Pragmas, predefined-pragmas, Predefined Pragmas))
$(P All implementations must support these, even if by just ignoring them:)
$(UL
$(LI $(LINK2 #inline, pragma inline))
$(LI $(LINK2 #lib, pragma lib))
$(LI $(LINK2 #mangle, pragma mangle))
$(LI $(LINK2 #msg, pragma msg))
$(LI $(LINK2 #startaddress, pragma startaddress))
)
$(DL
$(DT $(LNAME2 inline, $(D inline)))
$(DD $(P Affects whether functions are inlined or not. If at the declaration level, it
affects the functions declared in the block it controls. If inside a function, it
affects the function it is enclosed by. If there are multiple pragma inlines in a function,
the lexically last one takes effect.)
$(P It takes three forms:)
$(OL
$(LI
---
pragma(inline)
---
Sets the behavior to match the default behavior set by the compiler switch
$(DDSUBLINK dmd, switch-inline, $(TT -inline)).
)
$(LI
---
pragma(inline, false)
---
Functions are never inlined.
)
$(LI
---
pragma(inline, true)
---
If a function cannot be inlined with the $(DDSUBLINK dmd, switch-inline, $(TT -inline))
switch, an error message is issued. This is expected to be improved in the future to causing
functions to always be inlined regardless of compiler switch settings. Whether a compiler can
inline a particular function or not is implementation defined.
)
)
---
pragma(inline):
int foo(int x) // foo() is never inlined
{
pragma(inline, true);
++x;
pragma(inline, false); // supercedes the others
return x + 3;
}
---
)
$(DT $(LNAME2 lib, $(D lib)))
$(DD Inserts a directive in the object file to link in the library
specified by the $(ASSIGNEXPRESSION).
The $(ASSIGNEXPRESSION)s must be a string literal:
-----------------
pragma(lib, "foo.lib");
-----------------
)
$(DT $(LNAME2 mangle, $(D mangle)))
$(DD Overrides the default mangling for a symbol. It's only effective
when the symbol is a function declaration or a variable declaration.
For example this allows linking to a symbol which is a D keyword, which would normally
be disallowed as a symbol name:
-----------------
pragma(mangle, "body")
extern(C) void body_func();
-----------------
)
$(DT $(LNAME2 msg, $(D msg)))
$(DD Constructs a message from the arguments and prints to the standard error stream while compiling:
-----------------
pragma(msg, "compiling...", 1, 1.0);
-----------------
)
$(DT $(LNAME2 startaddress, $(D startaddress)))
$(DD 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.
)
)
$(H2 $(LNAME2 vendor_specific_pragmas, Vendor Specific Pragmas))
$(P Vendor specific pragma $(I Identifier)s can be defined if they
are prefixed by the vendor's trademarked name, in a similar manner
to version identifiers:
)
-----------------
pragma(DigitalMars_funky_extension) { ... }
-----------------
$(P Compilers must diagnose an error for unrecognized $(I Pragma)s,
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)
{ ... }
}
-----------------
$(SPEC_SUBNAV_PREV_NEXT attribute, Attributes, expression, Expressions)
)
Macros:
CHAPTER=9
TITLE=Pragmas