Possible Declarations

From RAD Studio
Jump to: navigation, search

Go Up to Declaration Syntax Index

The range of objects that can be declared includes:

  • Variables
  • Functions
  • Classes and class members (C++)
  • Types
  • Structure, union, and enumeration tags
  • Structure members
  • Union members
  • Arrays of other types
  • Enumeration constants
  • Statement labels
  • Preprocessor macros

The full syntax for declarations is shown below. The recursive nature of the declarator syntax allows complex declarators. You'll probably want to use typedefs to improve legibility.

In C++Builder declaration syntax, note the restrictions on the number and order of modifiers and qualifiers. Also, the modifiers listed are the only addition to the declarator syntax that are not ANSI C or C++. These modifiers are each discussed in greater detail in Variable Modifiers and Function Modifiers.

C++Builder declaration syntax

declaration:
    <decl-specifiers> <declarator-list>;
    asm-declaration
    function-definition
    linkage-specification
asm-declaration: 
  __asm  <(> string-literal <)> < ; or newline >
decl-specifier:
    storage-class-specifier
    type-specifier
    function-specifier
    friend (C++ specific)
    typedef
decl-specifiers:
    <decl-specifiers> decl-specifier
storage-class-specifier:
    auto
    register
    static
    extern
function-specifier: (C++ specific)
    inline
    virtual
simple-type-name:
    class-name
    typedef-name
    boolean
    char
    short
    int
    __int8
    __int16
    __int32
    __int64
    long
    signed
    unsigned
    float
    double
    void
declarator-list:     
    init-declarator
    declarator-list , init-declarator
init-declarator:    
    declarator <initializer>
declarator:
    dname
    modifier-list
    pointer-operator declarator
    declarator ( parameter-declaration-list )
    <cv-qualifier-list>      (C++ specifiс)
    declarator [ <constant-expression> ]
    ( declarator )
modifier-list:
    modifier
    modifier-list modifier
modifier:
    __cdecl
    __pascal
    __stdcall
    __fastcall
pointer-operator:
    * <cv-qualifier-list>
    & <cv-qualifier-list> (C++ specific)
    class-name :: * <cv-qualifier-list> (C++ specific)
cv-qualifier-list:     
    cv-qualifier <cv-qualifier-list>
cv-qualifier:
    const
    volatile
dname:     
    name
    class-name (C++ specific)
    ~ class-name (C++ specific)
    type-defined-name
elaborated-type-specifier:
    class-key identifier
    class-key class-name
    enum enum-name
class-key: (C++ specific)
    class
    struct
    union
enum-specifier:
    enum <identifier> { <enum-list> }
enum-list:
    enumerator
    enumerator-list , enumerator
enumerator:
    identifier
    identifier = constant-expression
constant-expression:
    conditional-expression
linkage-specification: (C++ specific)
    extern string { <declaration-list> }
    extern string declaration
type-specifier:
    simple-type-name
    class-specifier
    enum-specifier
    elaborated-type-specifier
    const
    volatile
declaration-list:
    declaration
    declaration-list ; declaration
type-name:
    type-specifier <abstract-declarator>
abstract-declarator:
    pointer-operator <abstract-declarator>
    <abstract-declarator> ( argument-declaration-list )
    <cv-qualifier-list>
    <abstract-declarator> [ <constant-expression> ]
    ( abstract-declarator )
argument-declaration-list:
    <arg-declaration-list>
    arg-declaration-list , ...
    <arg-declaration-list> ... (C++ specific)
arg-declaration-list:
    argument-declaration
    arg-declaration-list , argument-declaration
argument-declaration:
    decl-specifiers declarator
    decl-specifiers declarator = expression  (C++ specific)
    decl-specifiers <abstract-declarator>
    decl-specifiers <abstract-declarator> = expression   (C++ specific)
function-definition: 
    <decl-specifiers> declarator <declaration-list>  function-body
function-body: 
    compound-statement
initializer:
    = expression
    = { initializer-list }
    ( expression-list ) (C++ specific)
initializer-list:
    expression
    initializer-list , expression
    { initializer-list <,> }

See Also