Концептуально, я думаю, вы хотите, чтобы каждый ответ был аккуратно одной строкой. Итак, почему бы вам не попробовать это?
cout << "Enter the number: ";
string line;
getline(cin, line);
int number = std::stoi(line);
cout << "Enter names: ";
string names;
getline(cin, names);
Код правильно использует первый символ новой строки, дает номер, если строка верна или выбрасывает исключение, если это не так. Все бесплатно!
Все остальные дали вам канонический ответ «Вложенные функции не разрешены в стандарте 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
означает, что никакая функция вне этого файла не может вызвать его, если не передан указатель на функцию.
Определения локальных функций внутри функции недопустимы в C.
C не имеет вложенных функций. Вложенные функции GCC являются расширением языка.
Ваша ошибка во время выполнения в GCC является орфографической ошибкой. inner_funcion
должно быть inner_function
.
Вложенные функции не являются частью стандартов C. Поэтому нет гарантии, что он будет работать для всех компиляторов, и его определенно следует избегать.
Я не эксперт, но готов поспорить, это либо явно не разрешено, либо не определено спецификацией C99, поэтому, вероятно, лучше держаться подальше от него.
Вы используете вложенные функции - C не поддерживает такие вещи.
Это не является допустимым кодом C, внутренние функции не поддерживаются в C
Вложенные функции доступны в виде языкового расширения в GCC , но они не являются частью стандартного языка, поэтому некоторые компиляторы не разрешают их.
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.
Как упоминалось во многих ответах выше, внутренние функции не поддерживаются в 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?