Форум программистов, компьютерный форум CyberForum.ru

Безымянный аргумент функции - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
03.07.2013, 12:48     Безымянный аргумент функции #1
функция принимает аргумент, но у него нет имени

C++
1
2
3
4
5
6
7
8
9
10
11
void f(int)
{
    cout << "Hello world!";
}
 
int main()
{
    int n = 10;
    f(n);
    return 0;
}
Добавлено через 13 минут
...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.07.2013, 12:11     Безымянный аргумент функции #21
AntonChik, собственно для перегрузки такое и делают в частности. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
int f(int x, int, int z) {
  return x+z;
}
 
int f(int x, double, int z) {
  return x*z;
}
 
int main() {
    cout << f(1,0,2) << endl;
    cout << f(1,0.,2) << endl;
        return 0;
}
https://ideone.com/pM8Yp9
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
04.07.2013, 12:11     Безымянный аргумент функции #22
Цитата Сообщение от Jupiter Посмотреть сообщение
причинами чего?
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
04.07.2013, 12:24     Безымянный аргумент функции #23
Цитата Сообщение от Tulosba Посмотреть сообщение
Уважаемый Evg, не горячитесь так. Никто не утверждал, что этот код будет переносимым. Если Вам известны какие-то иные способы получения значения безымянного параметра, было бы интересно посмотреть.
Вместо того, чтобы городить кучу дополнительного кода в функции, могу предложить изящное решение - дать имя параметру.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Например, ты встраиваешься в чужую систему, которая пишется как универсальная на все случаи жизни. Поэтому ты обязан написать именно такой прототип функции, как требует того система. Поскольку система универсальная, а твой случай - частный, то тебе какие-то параметры могут и не понадобиться
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.07.2013, 12:24     Безымянный аргумент функции #24
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
и чё? я вызываю функцию и мне пофигу что там используется, а что нет. если не я эту функцию писал
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
04.07.2013, 12:52     Безымянный аргумент функции #25
Цитата Сообщение от Evg Посмотреть сообщение
встраиваешься в чужую систему
Цитата Сообщение от Jupiter Посмотреть сообщение
и чё?
Не, не, не, господа. Мы говорим о случае, когда у нас есть именно такая функция. Перефразировав специально для Jupiter, зачем вы написали именно такую функцию?

Это все понятно, что, если это нас не касается, то и хрен с ним. Но охота разобраться зачем оно вообще.

Цитата Сообщение от Evg Посмотреть сообщение
дать имя параметру
А-а.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int WithName(int x, bool b)
{
  return x;
}
int WithoutName(int x, bool)
{
  return x;
}
 
int main()
{
  cout << WithName(9, NULL);
  cout << WithoutName(9, NULL);
 
  return 0;
}
Результат один и тот же.
Вопрос по прежнему открыт. Зачем существуют параметры без имени?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
04.07.2013, 13:10     Безымянный аргумент функции #26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем существуют параметры без имени?
Просто так. Чтобы не заводить лишнее имя в процедуре, если параметр должен быть, но он не используется. Никаких других причин нет. Когда такое бывает - написал в посте #23.

Добавлено через 7 минут
Именованный и безымянный параметры играют роль исключительно внутри функции. В точке вызова функции нет никакой разницы, будет ли внутри вызываемой функции параметр иметь имя, или нет. В точке вызова важен только тип параметра, чтобы знать, как его правильно передать. А как этот параметр будет называться внутри функции - не играет никакой роли, т.к. в точке вызова нам не нужно обращаться к этому параметру (а именно для этого нужно имя переменой). Вернее, обращаться нужно в момент передачи параметра, но обращаемся к нему не по имени, а, грубо говоря, по порядковому номеру внутри круглых скобок в строгом соответствии с программными соглашениями (calling convenience)
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
04.07.2013, 13:20     Безымянный аргумент функции #27
Но самое-то интересное - можно ли получить внутри функции значение параметра, переданного без имени? Весь сыр-бор из-за этого.
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
04.07.2013, 13:33  [ТС]     Безымянный аргумент функции #28
Зачем существуют параметры без имени?
я сейчас вспомнил про перегруженные операции постфиксного инкремента и декремента
C++
1
2
operator++(int);
operator--(int);
в них аргумент как бы и не нужен, а введен только для того, чтобы были различия от префиксных операторов
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
04.07.2013, 13:43     Безымянный аргумент функции #29
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Но самое-то интересное - можно ли получить внутри функции значение параметра, переданного без имени?
Как я уже говорил, есть простой способ - дать имя аргументу. Код от этого не изменится ни внутри функции, ни в точке вызова функции. Различие будет только в том, что теперь к параметру можно будет обратиться.

Если же нужно обратиться к неименованному параметру без задания имени, то в общем случае ответ - "никак". В частных случаях можно. Но при этом нужно понимать, по каким правилам передаются параметры. Но код всё равно может считаться рабочим только в рамках одного компилятора. Так, например, если параметры передаются через стек, то через адрес одного параметра можно получить адрес другого параметра. Но при этом нет никакой гарантии, что параметр, который пришёл через стек, компилятор не переложил внутри функции на регистр. Разумно предположить, что с безымяным параметром так желать ни к чему (поскольку регистров мало, а тратить их на ненужный параметр - расточительство). Если изначально параметр пришёл на регистре, то очевидно, что через адрес другого параметра мы наш безымяный параметр уже не прочтём. Т.е. можно обратиться только при помощи ассемблерных конструкций напрямую к регистру. При этом точно так же у нас нет никакой гарантии, что компилятор не переиспользовал регистр по своим нуждам. Это действие уже вероятное, т.к. незачем держатьрегистр под неиспользуемую переменную, его лучше заиспользовать под полезные нужды
AntonChik
04.07.2013, 13:53
  #30

Не по теме:

кстати раз уж зашел разговор о всяческих извратах, то у меня возник вопрос, а есть ли способ в коде дать конкретному компилятору понять, что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?)

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.07.2013, 14:13     Безымянный аргумент функции #31
Цитата Сообщение от AntonChik Посмотреть сообщение
что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?
условную компиляцию никто не отменял. #ifdef в руки и вперед
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.07.2013, 14:16     Безымянный аргумент функции #32
а откуда взялось красивое число 5???
Ты, видимо, не знаешь, как работает адресная арифметика.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
04.07.2013, 14:57     Безымянный аргумент функции #33
Цитата Сообщение от AntonChik Посмотреть сообщение

Не по теме:

кстати раз уж зашел разговор о всяческих извратах, то у меня возник вопрос, а есть ли способ в коде дать конкретному компилятору понять, что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?)

Что конкретно ты подразумеваешь под "веткой"?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
04.07.2013, 15:38     Безымянный аргумент функции #34
Цитата Сообщение от Герц Посмотреть сообщение
Ты, видимо, не знаешь, как работает адресная арифметика.
Ну так просвети
повторю вопрос
C++
1
2
3
void f( int )
{ int b = 42; 
cout << *(&b+5) << endl; }
откуда взялось число 5? почему не 10 не 1?

Добавлено через 26 минут
а ну да там инт стоит
Цитата Сообщение от ValeryS Посмотреть сообщение
int b = 42;
не обратил вчера внимания
сдвиг будет на 20 байт, при int 4байта
но откуда 5?

Добавлено через 9 минут
Вот вам еще одно баловство
доступ к приватной переменной
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
class A
{
    public:
    int a;
    private:
    int b;
    public:
void fnc()
 {std::cout<<b<<std::endl;};
    
};
 
int main()
{
    A c;
    *(&c.a+1)=5;
    c.fnc();
    return 0;
}
http://ideone.com/CBdvRO
правда кому и зачем может понадобится я не знаю
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.07.2013, 15:52     Безымянный аргумент функции #35
В том конкретном коде смещение в 20 байт взялось нипочему, так уж на платформе, на которой этот код выдал ожидаемый результат, осуществляется передача аргументов при вызове функций.
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента. Пробовал от -512 байт до 512.

Про нарушение спецификаторов доступа, в этом нет ничего особенного, если понимать внутренний layout объектов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class One {
    int a;
    int b;
    int c;
};
 
struct Another {
    int a;
    int b;
    int c;
}
 
One clsInstance;
Another& asStruct = *reinterpret_cast<Another*>(&One);
asStruct.a = asStruct.b = asStruct.c = 0;
Спецификаторы доступа нужна для программистов, а кто нарушает их такими методами - сам себе злобный буратино.
P.S. при наличии в классе виртуальных функций такой подход в лоб не пройдет.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.07.2013, 16:02     Безымянный аргумент функции #36
Цитата Сообщение от Герц Посмотреть сообщение
я не нашел такого смещения
так ищется оно просто:
C++
1
2
3
4
void f( char a )
{ char b = 42; 
cout << (char*)&a - (char*)&b << endl;
}
Добавлено через 1 минуту
На VS2012 x64 получилось следующее:
C++
1
2
3
4
char - 17
short - 20
int - 20
long long - 24
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
04.07.2013, 16:09     Безымянный аргумент функции #37
Цитата Сообщение от Герц Посмотреть сообщение
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента.
а утверждал что от "железа" это не зависит
Вполне может быть что аргументы идут через регистр и со стека ты их не достанешь
да и локальные переменные могут в регистре лежать

Цитата Сообщение от Герц Посмотреть сообщение
Спецификаторы доступа нужна для программистов, а кто нарушает их такими методами - сам себе злобный буратино.
А я говорил что нужно всем всегда делать?
единственно что могу предположить, это если пользуешь чужой класс
но завтра реализация класса изменится и программа летит
Все эти адресные арифметики штука очень "острая"
при неправильном использовании легко можно "порезаться"

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
char b
стоп стоп
вчера ты писал
C++
1
int b
а это несколько другое
C++
1
2
int b=23;
*(&b+1)
и
C++
1
2
char  b=23;
*(&b+1)
дадут как бы разные адреса
не находишь?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.07.2013, 16:14     Безымянный аргумент функции #38
Цитата Сообщение от ValeryS Посмотреть сообщение
дадут как бы разные адреса
в сообщении #36 речь идет о байтах, а не о кол-ве элементов.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.07.2013, 16:41     Безымянный аргумент функции #39
а утверждал что от "железа" это не зависит
В моем маке железо такое же, как в настольном компе. Core i7 3-его поколения и прочая. Разница именно в платформе и в компиляторе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 17:15     Безымянный аргумент функции
Еще ссылки по теме:

C++ Не читается аргумент функции
Опциональный ссылочный аргумент функции C++
C++ Auto как аргумент функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.07.2013, 17:15     Безымянный аргумент функции #40
Это:
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int fnc1()
{
 int a=90;
 return a;
}
int fnc2()
{
 int b;
 return b;
}
.........
fnc1();
int s=fnc2();
исходник вируса "бомж", который тупо роется в мусоре.

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
как я по указателю размер массива вычислял.
Вполне валидная операция языка --z, только выглядит совсем не так, как аналогичного назначения безобразие на c++.
Yandex
Объявления
04.07.2013, 17:15     Безымянный аргумент функции
Ответ Создать тему
Опции темы

Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru