Можно ли в C или C ++ создать функцию внутри другой? - PullRequest
11 голосов
/ 13 февраля 2010

Может кто-нибудь сказать мне, если это возможно в C или C ++?

void fun_a();
//int fun_b();
...
main(){
   ...
   fun_a();
   ...
   int fun_b(){
     ...
   }
   ...
} 

или что-то подобное, например, класс внутри функции?

спасибо за ваши ответы,

Ответы [ 15 ]

1 голос
/ 13 февраля 2010

Как уже упоминалось в других ответах, стандартные C и C ++ не позволяют вам определять вложенные функции. (Некоторые компиляторы могут разрешить это как расширение, но я не могу сказать, что видел его использованным).

Вы можете объявить другую функцию внутри функции, чтобы ее можно было вызывать, но определение этой функции должно существовать вне текущей функции:

#include <stdlib.h>
#include <stdio.h>

int main( int argc, char* argv[])
{
    int foo(int x);

    /*     
    int bar(int x) {  // this can't be done
        return x;
    }
    */

    int a = 3;

    printf( "%d\n", foo(a));

    return 0;
}


int foo( int x) 
{
    return x+1;
}

Объявление функции без явного «спецификатора связи» имеет extern связь. Таким образом, хотя объявление имени foo в функции main() ограничено main(), оно будет ссылаться на функцию foo(), которая будет определена позже в файле (или в другом файле, если это где foo() определяется).

1 голос
/ 13 февраля 2010

К сожалению, в C / C ++ нет вложенных функций.

1 голос
/ 13 февраля 2010

Хотя C и C ++ оба запрещают вложенные функции, некоторые компиляторы все равно поддерживают их (например, если память служит, gcc может, по крайней мере, с правильными флагами). Тем не менее, вложенный функтор гораздо более переносим.

1 голос
/ 13 февраля 2010

Не в стандартном C, но gcc и clang поддерживают их как расширение. См. онлайн-руководство по gcc .

1 голос
/ 13 февраля 2010

Невозможно объявить функцию внутри функции. Однако вы можете объявить функцию в пространстве имен или в классе в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...