Как использовать аргументы безымянной функции в C или C ++ - PullRequest
9 голосов
/ 22 марта 2010

Как использовать аргументы функции, объявленные как

void f(double)
{
    /**/
}

если это возможно?

Ответы [ 5 ]

41 голосов
/ 22 марта 2010

Я надеюсь, что пример может помочь:

// Declaration, saying there is a function f accepting a double.
void f(double);

// Declaration, saying there is a function g accepting a double.
void g(double);

// ... possibly other code making use of g() ... 

// Implementation using the parameter - this is the "normal" way to use it. In
// the function the parameter is used and thus must be given a name to be able
// to reference it. This is still the same function g(double) that was declared
// above. The name of the variable is not part of the function signature.
void g(double d)
{
  // This call is possible, thanks to the declaration above, even though
  // the function definition is further down.
  f(d);
}

// Function having the f(double) signature, which does not make use of 
// its parameter. If the parameter had a name, it would give an 
// "unused variable" compiler warning.
void f(double)
{
  cout << "Not implemented yet.\n";
}
2 голосов
/ 15 декабря 2015

Вот одна хорошая ссылка

void bar(int arg1, int /* Now unnamed */, int arg3)
{
    // code for bar, using arg1 and arg3
}

Иногда, однако, вышеупомянутый подход используется не только для поддержки унаследованного кода, но и для обеспечения выбора перегруженной функции, возможно, конструктора. Другими словами, передавая дополнительный аргумент, просто чтобы убедиться, что определенная функция выбрана. Кроме того, во время разработки кода может помочь использование неназванного аргумента, если, например, вы пишете заглушки для некоторых подпрограмм.

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

2 голосов
/ 22 марта 2010

Нет. Вы должны дать ему имя. То есть

void f(double myDouble)
{
    printf("%f", myDouble * 2);
}

или если вы используете iostreams:

void f(double myDouble)
{
    cout << myDouble * 2;
}
0 голосов
/ 22 марта 2010

Компилятор передаст 0 по умолчанию .... это так, как мы привыкли различать постфиксный оператор приращения, и нам никогда не придется использовать фактическое переданное значение ..

0 голосов
/ 22 марта 2010

Параметр все еще может быть помещен в стек, так что вы можете найти его там (см. Комментарии ниже)

Только для , например ( очень непереносимый )

#include<stdio.h>
void f(double)
{
    double dummy;
    printf("%lf\n",*(&dummy-2)); //offset of -2 works for *my* compiler
}

int main()
{
    f(3.0);
}

Я не уверен, почему вы хотите это сделать, хотя

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