Функция внутри функции в C - PullRequest
7 голосов
/ 06 сентября 2011

Кто-нибудь, пожалуйста, уточните эти ошибки: -

void main()
{
    int a=5, b=60, func();

    printf("\nI am in main-1");

    int func(){
        printf("\nI am in funct");
        return 1;
    }
    func();
    printf("\nI am in main-2");
}

Я получаю следующие ошибки:

  • В функции 'main':
  • Строка 8: ошибка: статическое объявление 'func' следует нестатично Заявление
  • Строка 4: ошибка: предыдущее объявление 'func' было здесь
  • Строка 3: предупреждение: тип возвращаемого значения 'main' не является 'int'

Я думаю, что C разрешает вложенный класс, потому что следующий код работает нормально:

void outerfunc()
{
    int func()
    {
        printf("\nI am in funct");
        return 1;
    }

    func();
}

void main()
{
    printf("\nI am in main-1");

    outerfunc();
    printf("\nI am in main-2");
}

Ответы [ 8 ]

14 голосов
/ 06 сентября 2011

Вы используете расширение компилятора GNU C, которое позволяет объявлять вложенные функции.Ошибка возникает из-за того, что предварительные объявления вложенных функций в расширении GCC должны начинаться с ключевого слова auto.

int a=20,b=11;
int main()
{
  int a=5, b=60; 
  auto int func(); // <--------- here
  func(); // <- call it
  printf("\nI am in main-1");

  int func(){
  printf("\nI am in funct");
  return 1;
  }

printf("\nI am in main-2");
 return 0;
}

Подробнее см. http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html.

9 голосов
/ 06 сентября 2011

ANSI C не позволяет определять вложенные функции. И ваша основная функция должна вернуть int .

1 голос
/ 06 сентября 2011

Вложенные функции являются специфичными для gcc расширение ; они не универсально поддерживаются.

Что касается предупреждения о main, стандартные сигнатуры для main

int main(void)
int main(int argc, char **argv) // or equivalent

Реализация может предоставлять дополнительные подписи (некоторые компиляторы допускают третий параметр для переменных среды), но эти дополнительные подписи должны быть документированы реализацией; IOW, void main() является действительной подписью для main, если ваша документация компилятора явно перечисляет ее как таковую.

В случае сомнений используйте одну из стандартных подписей выше.

1 голос
/ 06 сентября 2011

Что вы имеете в виду, это особенность GCC , она никогда не была "правильной" функцией C (т.е. частью спецификации ANSI C).

Если вы хотите использовать эту функцию, то я считаю, что вы после этого:

#include <stdio.h>

int a = 20, b = 11;

int main( int argc, char* argv[] )
{
    int a = 5, b = 60;
    auto int func( void );

    printf("\nI am in main-1");

    int func( void )
    {
        printf("\nI am in funct");
        return 1;
    }

    printf("\nI am in main-2");
    return func();
}

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

Вложенная функция всегда не имеет связи. Объявление одного с внешним или статическим является ошибочным. Если вам нужно объявить вложенную функцию до ее определения, используйте auto (что в противном случае бессмысленно для объявлений функций).

Приведенный выше пример использует ключевое слово auto. Я также позволил себе исправить вашу декларацию main: -)

1 голос
/ 06 сентября 2011

Вложенные функции недопустимы в стандарте C / C ++. Просто (вперед) объявите func() внутри main(), если вы хотите определить его позже.

int main()
{
  int a=5, b=60, func();

printf("\nI am in main-1");

  int func();  // <---- declare inside main()

printf("\nI am in main-2");
}


int func(){    // <---- define later
  printf("\nI am in funct");
  return 1;
}
0 голосов
/ 06 сентября 2011

C ++ не позволяет включать функции в другие функции.

Попытка сделать это в VS 2010 дает:

'funct': недопустимые определения локальных функций

Вам нужно переместить эту функцию и ее объявление за пределы main.

0 голосов
/ 06 сентября 2011

Это работает, если вы удалите объявление func() в объявлениях переменных int.

0 голосов
/ 06 сентября 2011
  1. Вы не определили func перед вызовом.
  2. Относится к исходной строке.
  3. Вы не возвращаете int.
...