1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C++】関数内ローカル関数という禁術

Posted at

関数内ローカル関数

関数内で宣言することで、その関数でしか使っていないという明示になる。
しかし、関数内の記述が増えるので分かりにくくなってしまう。

C

GCC 拡張された C では以下のようにかけます。
詳しくは 【C言語】GCC拡張によるNested Function(関数内関数) を読んでください。

#include <stdio.h>

int main() {
    void helloWorld() {
        printf("HelloWorld\n");
    }
    
    helloWorld();
}

C++

同様にこう書いても、C++ ではエラーになります。

#include <iostream>

int main() {
    void helloWorld() {
        std::cout << "HelloWorld" << std::endl;
    }
    
    helloWorld();
}

本来、 std::function など使うべきところですが、以下のようにも出来ます。

#include <iostream>

int main() {
    struct internal {
        static void helloWorld() {
            std::cout << "HelloWorld" << std::endl;
        }
    };
    
    internal::helloWorld();
}

構造体を内部で定義し、その static 関数として 関数内ローカル関数を定義するというものです。
関数宣言時にはブロック内に書き、関数呼び出し時にはスコープがつくので、案外分かりやすい気がします。

GCC 拡張の C とは違い、グローバルな関数と同じような扱いになるので、以下のようなことは出来ません。

#include <iostream>

int main() {
    int variable = 0;
    struct internal {
        static void helloWorld() {
            variable = 5; // ERROR
            std::cout << "HelloWorld" << std::endl;
        }
    };
    
    internal::helloWorld();
}

選択肢のひとつとして知っておいても良いのではないかと思います。

1
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?