declaration:
decl-specifiersopt declarator-listopt ;
asm-declaration 
function-definition 
linkage-specification
template-declaration:
asm-declaration:
__asm( string-literal );
decl-specifiers:
decl-specifiersopt decl-specifier
decl-specifier:
storage-class-specifier 
type-specifier 
fct-specifier 
friend 
typedef
__declspec ( extended-decl-modifier-seq )
storage-class-specifier:
auto 
register 
static 
extern
fct-specifier:
inline 
virtual
type-specifier:
simple-type-name 
class-specifier 
enum-specifier 
elaborated-type-specifier 
const 
volatile
extended-decl-modifier-seq:
extended-decl-modifieropt
extended-decl-modifier extended-decl-modifier-seq
extended-decl-modifier:
thread
naked
dllimport
dllexport
simple-type-name:
complete-class-name 
qualified-type-name 
char 
short 
int 
long 
signed 
unsigned 
float 
double 
void
elaborated-type-specifier:
class-key  identifier 
class-key  class-name
enum-name
class-key:
class 
struct 
union
qualified-type-name:
typedef-name 
class-name  ::  qualified-type-name
complete-class-name:
qualified-class-name  
::  qualified-class-name
qualified-class-name:
class-name 
class-name  ::  qualified-class-name
enum-specifier:
enum identifieropt { enum-listopt }
enum-list:
enumerator 
enum-list  ,  enumerator
enumerator:
identifier 
identifier  =  constant-expression
constant-expression:
conditional-expression
linkage-specification:
extern string-literal  {  declaration-listopt  } 
extern string-literal declaration
declaration-list:
declaration
declaration-list  declaration
template-declaration:
template < template-argument-list > declaration
template-argument-list:
template-argument
template-argument-list , template-argument
template-argument:
type-argument
argument-declaration
type-argument:
class identifier
template-class-name:
template-name < template-arg-list >
template-arg-list:
template-arg
template-arg-list , template-arg
template-arg:
expression
type-name
original-namespace-name :
identifier
namespace-definition :
original-namespace-definition
extension-namespace-definition
unnamed-namespace-definition
original-namespace-definition :
namespace identifier { namespace-body }
extension-namespace-definition :
namespace original-namespace-name { namespace-body }
unnamed-namespace-definition :
namespace { namespace-body }
namespace-body :
declaration-seqopt
id-expression :
unqualified-id
qualified-id
nested-name-specifier :
class-or-namespace-name :: nested-name-specifieropt
class-or-namespace-name :
class-name
namespace-name
namespace-name :
original-namespace-name
namespace-alias
namespace-alias :
identifier
namespace-alias-definition :
namespace identifier = qualified-namespace-specifier;
qualified-namespace-specifier :
::opt nested-name-specifieropt class-or-namespace-name
using-declaration :
using ::opt  nested-name-specifier unqualified-id
using :: unqualified-id
using-directive :
using namespace ::opt nested-name-specifieropt namespace-name