2012-01-13 3 views
3

Я не понимаю, почему этот код работает.Аргументы функции

int f(int,int); 

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

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

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

+6

Compile со всеми предупреждениями, не игнорировать любые. –

+0

И я тоже. Как вы можете назвать 'f' до того, как он будет объявлен? – ybungalobill

+2

@ybungalobill: В C вы можете. Это называется явным объявлением. Возможно, он говорит о C, а не C++, или использовал компилятор C для компиляции этого кода. –

ответ

8

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

Следовательно, это совершенно легально, не называя ваши параметры. Однако вы не можете их использовать. (Если, конечно, вы не сделать некоторые взлома)

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

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, с МСВС 2008. Код зависит от того, как параметры нажимаются на стек аргументов функции.

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

+2

Можете ли вы написать UB? Определенная реализация не учитывается, так как она может измениться при следующем компиляции. (Если вы не можете указать на публичную документацию компилятора, которая гарантирует, что это конкретное поведение является стабильным) – sehe

+0

Моя точка требует, чтобы «это работает для меня» уже немного растянуто. – sehe

6

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

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

+0

Вы можете немного повеселиться с C++, хотя и на самом деле используете параметр :) –

+0

@LuchianGrigore, конечно, если вы знаете детали реализации, но зачем вам :) –

+0

Для удовольствия, конечно. –

2

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

2

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

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

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

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

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

obj& operator=(const obj&) = delete; 
+0

. Это помечено 'C++' :) –

3

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

+2

Это на самом деле очень полезно, когда API, которому вы должны следовать, более общий, чем вы хотите. Например, когда вам нужна ваша функция, это виртуальный метод и просто не нуждается ни в чем, что передается во всех случаях. Большинство библиотек используют эту функцию в некоторой степени. – LiKao

4

Вы не можете использовать первый аргумент 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 */) { 
    ... 
    } 
}; 
+0

Вы можете, если вы действительно хотите :). –

+0

@ Luchian: Увидим это в вашем ответе ... и одобренный за явную характность этого. – LiKao

Смежные вопросы