関数宣言の構文
関数には、グローバル関数と、クラスまたは構造体のメンバー関数があります。 これらは次のシーケンスで宣言します。
[friend] [storage-class-specifier] [function-specifier]
[[cv-qualifer] type-specifier] declarator [cv-qualifer]
[exception-spec]
[friend] [storage-class-specifier] [function-specifier]
[[cv-qualifer] type-specifier] [*|&] [ms-modifer] identifier
( argument-list ) [cv-qualifer] [exception-spec]
宣言指定子。 「指定子」を参照してください。
クラス内では、省略可能な friend 指定子。
ストレージ クラスの指定子 (省略可能)。 グローバル関数の場合、許可されるストレージ クラス指定子は static と extern です。 クラス メンバー関数の場合、extern は使用できません。
省略可能な関数指定子。 グローバル関数の場合、許可される関数指定子は inline だけです。 クラス メンバー関数の場合、virtual と inline を使用できます。コンストラクターの場合、explicit を使用できます。
戻り値の型を示す型指定子 (* または & を使用してポインター型または参照型に変更されることがあります)。
宣言子。
戻り値の型を変更するポインターまたは参照演算子 (省略可能)。
呼び出し規約を指定する省略可能な Microsoft 固有の修飾子。 「Microsoft 固有の修飾子」を参照してください。
関数の名前。 関数がクラスまたは構造体のメンバーである場合、名前はスコープ解決演算子を使用して修飾されている場合があります。
引数の宣言のリストをかっこ () で囲まれた引数宣言リスト。
const または volatile 修飾子 (省略可能)。 このコンテキストでは、const は、クラス メンバーにのみ使用することができ、関数がクラスのデータ メンバーを変更しないことを示します。
戻り値の型が関数ポインターである場合、以下で説明するように、宣言の構文が複雑になる場合があります。
- 関数がどの例外をスローするかを示す省略可能な例外指定。 「例外の指定」を参照してください。
このように宣言された識別子の型は、const または volatile (指定されている場合) 関数で、指定された引数リストを受け取り、宣言指定子で示された型を返すように構成される可能性があります。
2 つの単純な関数宣言の例を次に示します。
char *strchr( char *dest, char *src );
static int atoi( const char *ascnum ) const;
関数へのポインターを返す関数の宣言
関数ポインター型を返す関数を宣言する場合は、typedef を使用して関数ポインター型のエイリアスを宣言することをお勧めします。 次に例を示します。
typedef int (*fp)(int);
fp myFunction(char* s); // function returning function pointer
このように記述していない場合でも、識別子 (上の例では fp) を関数名と引数リストで置き換えることで、関数ポインターの宣言構文から関数宣言の正しい構文を次のように導き出すことはできます。
int (*myFunction(char* s))(int);
この宣言は、上記の typedef を使用した宣言と同等です。