Аргументы функции - PullRequest
       1

Аргументы функции

3 голосов
/ 13 января 2012

Я не понимаю, почему этот код работает.

int f(int,int);

int main()
{
    f(12,21);
    return 0;
}

int f(int,int b)
{
    return 0;
}

Как я могу использовать первый аргумент в функции f (...)?

Ответы [ 6 ]

8 голосов
/ 13 января 2012

Имена параметров не являются частью сигнатуры функции, только ее имя и типы параметров.

Поэтому совершенно законно не называть ваши параметры. Тем не менее, вы не можете их использовать. (если, конечно, вы не взломаете)

Некоторые взломы: Примечание - не зависит от платформы, не гарантируется стандартом, но весело :) 1007 *

void foo (int x, int, int z)
{
   int* pz = &z;
   int y = *(--pz);
   cout << x << " " << y << " " << z;
}

int main()
{
    foo(2,3,4);
    // prints "2 3 4"
}

Это работает для меня на Win7, с MSVS 2008. Код зависит от того, как параметры помещаются в стек аргументов функции.

В рабочем коде вы должны использовать имена для всех параметров, в том числе в объявлениях, и сделать их как можно более описательными.

6 голосов
/ 13 января 2012

Вы не можете. Если вы не дадите ему имя. Но вы не используете их в этой функции.

Обычно имя аргумента опускается, чтобы избежать предупреждения о его неиспользовании. В функции f вы, вероятно, будете предупреждены о том, что b не используется, но не о первом аргументе.

4 голосов
/ 13 января 2012

вы не можете использовать первый аргумент f(...).Отсутствующее имя переменной говорит компилятору, что вы явно хотите игнорировать этот параметр.

Хотя это может показаться непригодным на первый взгляд, на самом деле это очень много, когда вам нужно следовать API (например, из-за виртуальных методов).) и ваша функция просто не заботится обо всем, что получает от вызывающей стороны.

Простой пример:

class Painter {
public:
   virtual void paint( Object o, viewscreen * screen ) = 0;
};

class WindowPainter {
public:
   virtual void paint( Object o, viewscreen * screen ) {
   ...
   }
};

class ConsolePainter {
public:
   // The console is available as std::cout globaly
   // often the name is just put in comments, to reference the common api  
   virtual void paint( Object o, viewscreen * /* screen */) {
   ...
   }
};
3 голосов
/ 13 января 2012

Вы не можете использовать этот первый аргумент. Первоначальное определение языка Си было чрезвычайно разрешающим для таких вещей. То, что вы можете это сделать, не означает, что для этого есть какая-либо полезная причина.

2 голосов
/ 13 января 2012

Параметру функции не нужны имена, если вы их не используете.

Если вы хотите использовать первый аргумент, присвойте ему имя:

int f(int a,int b)
{
    return 0;
}

Вы редко видите, как это делается в определениях функций, но это чаще встречается в объявлениях.

Например, если вы «удаляете» конструктор, тогда нет смысла именовать параметры:

obj& operator=(const obj&) = delete;
2 голосов
/ 13 января 2012

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

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