Définitions et déclarations externes

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Syntaxe de déclaration - Index

Les spécificateurs de classe de stockage auto et register ne peuvent pas apparaître dans une déclaration externe. Pour chaque identificateur d'une unité de traduction déclaré avec attribut de liaison interne, une seule définition externe est possible.

Une définition externe est une déclaration externe qui définit aussi un objet ou une fonction ; c'est-à-dire qui alloue aussi de la mémoire. Si un identificateur déclaré avec un attribut de liaison externe est utilisé dans une expression (autre que dans l'opérande de sizeof), il doit exister très exactement pour lui une seule définition externe dans l'ensemble du programme.

Le compilateur C++ autorise des déclarations ultérieures de noms externes, comme des tableaux, des structures et des unions, afin de compléter les informations contenues dans les déclarations existantes. Par exemple :

int a[];              // no size
struct mystruct;      // tag only, no member declarators
  .
  .
  .
int a[3] = {1, 2, 3}; // supply size and initialize
struct mystruct {
   int i, j;
};                    // add member declarators

Le diagramme de syntaxe suivant couvre la syntaxe de la déclaration d'une classe. Dans la section relative aux classes (commençant par Classes), vous trouverez quelques exemples de déclaration d'une classe. Références lvalue décrit en détail les types référence lvalue C++ (en rapport avec les types pointeur). Enfin, reportez-vous à Utilisation des templates pour une description des classes de type template.

Syntaxe des déclarations de classes Appmethod C++ (C++ seulement)

class-specifier:                                   
  class-head { <member-list> }                       
class-head:                                          
  class-key <identifier> <base-specifier>          
  class-key class-name <base-specifier>            
member-list:                                        
  member-declaration <member-list>                     
  access-specifier : <member-list>                     
member-declaration:                                     
  <decl-specifiers> <member-declarator-list>;      
  function-definition <;>                          
  qualified-name ;                                
member-declarator-list:                              
  member-declarator                                
  member-declarator-list, member-declarator        
member-declarator:                                 
  declarator <pure-specifier>                 
  <identifier> : constant-expression            
pure-specifier:                                  
  = 0                                     
member-initializer-list:                           
  member-initializer                                  
  member-initializer , member-initializer-list       
member-initializer:                                   
  class-name ( <argument-list> )                     
  identifier ( <argument-list> )                     
operator-function-name:                                 
  operator operator-name                            
base-specifier:
  : base-list
  class-name 
  virtual <access-specifier> class-name
  access-specifier <virtual> class-name
base-list:
  base-specifier
  base-list , base-specifier
access-specifier:
  private
  protected
  public                                                       
conversion-function-name:
   operator conversion-type-name
conversion-type-name:
  type-specifiers <pointer-operator>
constructor-initializer:
  :member-initializer-list
operator-name: one of
  new delete sizeof typeid
  +  -  *  /  %  ^
  &  |  ~  !  =  <>
  +=  -=  =*  /=  %=  ^=
  &=  |=  <<  >>  >>=  <<=
  ==  !=  <=  >=  &&  ||
  ++  __  ,  ->*  ->  ()
  [ ]  .*

Voir aussi