Функции в функционируют в C

Концептуально, я думаю, вы хотите, чтобы каждый ответ был аккуратно одной строкой. Итак, почему бы вам не попробовать это?

cout << "Enter the number: ";
string line;
getline(cin, line);
int number = std::stoi(line);

cout << "Enter names: ";
string names;
getline(cin, names);

Код правильно использует первый символ новой строки, дает номер, если строка верна или выбрасывает исключение, если это не так. Все бесплатно!

30
задан Rafael S. Calsaverini 5 June 2009 в 19:24
поделиться

10 ответов

Все остальные дали вам канонический ответ «Вложенные функции не разрешены в стандарте C» (поэтому любое их использование зависит от вашего компилятора).

Ваш пересмотренный пример:

double stuff(double a, double b)
{
  struct parameters
  {
    double a, b;
  };

  double f(double x, void * params)
  {
    struct parameters p = (struct parameters *) params;
    double a = p->a, b = b->b;
    return some_expression_involving(a,b,x);
  }
  struct parameters par = {a,b};

  return integrate(&f, &par);     // return added!
}

Поскольку вы говорите, что такие функции, как интегратор, нужны

  double (*f)(double x, void * par);

Я не понимаю, почему вы действительно нужны вложенные функции вообще. Я хотел бы написать:

struct parameters
{
    double a, b;
};

static double f(double x, void *params)
{
    struct parameters p = (struct parameters *) params;
    double a = p->a, b = b->b;
    return some_expression_involving(a,b,x);
}

double stuff(double a, double b)
{
    struct parameters par = { a, b };
    return integrate(f, &par);
}

Приведенный выше код должен работать в C89 (если только не возникает проблема с инициализацией 'par') или C99; эта версия кода предназначена только для C99 с использованием составного литерала для параметра (раздел 6.5.2.5 Составные литералы):

double stuff(double a, double b)
{
    return integrate(f, &(struct parameters){a, b});
}

Скорее всего, у вас всего несколько вариантов 'struct тип параметров. Вам нужно предоставить отдельные (достаточно) значимые имена для различных функций - у вас может быть только одна функция с именем 'f' для исходного файла.

Единственное незначительное преимущество версии с вложенными функциями заключается в том, что вы можете быть уверены, что никакая другая функция, кроме stuff, не вызывает f. Но, учитывая пример кода, это не главное преимущество; статическое определение f означает, что никакая функция вне этого файла не может вызвать его, если не передан указатель на функцию.

22
ответ дан Jonathan Leffler 11 October 2019 в 13:05
поделиться

Определения локальных функций внутри функции недопустимы в C.

1
ответ дан aJ. 11 October 2019 в 13:05
поделиться

C не имеет вложенных функций. Вложенные функции GCC являются расширением языка.

Ваша ошибка во время выполнения в GCC является орфографической ошибкой. inner_funcion должно быть inner_function.

8
ответ дан Yamaneko 11 October 2019 в 13:05
поделиться

Вложенные функции не являются частью стандартов C. Поэтому нет гарантии, что он будет работать для всех компиляторов, и его определенно следует избегать.

1
ответ дан Shawn Chin 11 October 2019 в 13:05
поделиться

Я не эксперт, но готов поспорить, это либо явно не разрешено, либо не определено спецификацией C99, поэтому, вероятно, лучше держаться подальше от него.

0
ответ дан pjbeardsley 11 October 2019 в 13:05
поделиться

Вы используете вложенные функции - C не поддерживает такие вещи.

3
ответ дан 11 October 2019 в 13:05
поделиться

Это не является допустимым кодом C, внутренние функции не поддерживаются в C

1
ответ дан Naveen 11 October 2019 в 13:05
поделиться

Вложенные функции доступны в виде языкового расширения в GCC , но они не являются частью стандартного языка, поэтому некоторые компиляторы не разрешают их.

30
ответ дан 27 November 2019 в 23:24
поделиться

In the event you were wondering how to turn off GCC extensions and such.

You can use the -ansi flag which essentially sets the standard to c89, and turns off GCC features which are incompatible with ISO C90.

See the docs for more information. Check out the -std flag too.

1
ответ дан 27 November 2019 в 23:24
поделиться

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

Непроверенный пример:

double some_function( double x, double y)
{
  struct InnerFuncs
  {
    double inner_function(double x)
    { 
      // some code
      return x*x;
    }
    // put more functions here if you wish...
  } inner;

  double z;
  z = inner.inner_function(x);
  return z+y; 
}

Обратите внимание, что этот ответ не должен означать, что я считаю, что внутренние функции хорошая идея в показанном вами использовании.

Редактирование спустя годы:

C ++ теперь позволяет нам использовать лямбды как внутренние функции. В случае с моим игрушечным примером, приведенным выше, это выглядело бы примерно так:

double some_function( double x, double y)
{
   auto inner_function = [&]() { return x * x; }

   double z;
   z = inner_function ();
   return z + y;
}

Обратите внимание, что локальная переменная x автоматически захватывается внутри лямбда-выражения, что является очень приятной особенностью.

Подробнее здесь: Что такое лямбда-выражение в C ++ 11?

7
ответ дан 27 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: