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

С++ для начинающих

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

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

03.07.2013, 12:48. Просмотров 2370. Ответов 51
Метки нет (Все метки)

функция принимает аргумент, но у него нет имени

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 минут
...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 12:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Безымянный аргумент функции (C++):

Вычислить значение функции аргумент которой вычисляется из другой кусочно заданной функции - C++
Решите программу то я не знаю как:hysteric: Вычислить значение y в зависимости от выбранной функции \varphi (x), аргумент которой...

Непонятный аргумент функции - C++
Кто-нибудь может подсказать, что принимает такая функция в качестве аргумента? void foo(int (**i)(double)) { ..... }

Не читается аргумент функции - C++
void recursReverse(char* str, size_t len) { static size_t len2 = len; while (len2 &gt; 1) { std::swap(*str, *(str + len2 - 1)...

Передача функции в аргумент - C++
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Auto как аргумент функции - C++
Возможно ли объявить параметр функции как auto? void func(auto pt); //...

Класс как аргумент функции - C++
Доброго времени суток:) Набрёл на такой пример в openGL и не могу понять как он робит, подскажите. Вот описание ф-ции: void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.07.2013, 10:51 #16
Сами выдумали себе проблему, сами и мучайтесь.

Идёте берёте руководство по конкретному компилятору. Смотрите, какой протокол вызова он выберет для этой конкретной функции и понимаете, что аргумент засунут в регистр, а то и вовсе был вычислен и забыт достаёте свой аргумент.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
04.07.2013, 11:08 #17
OhMyGodSoLong, короче все как обычно свелось к реализации конкретного компилятора и панацеи не существует? Худо.
Тогда зачем вообще оставили такую возможность?
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
04.07.2013, 11:27 #18
Цитата Сообщение от 120° Посмотреть сообщение
все, разобрался. это вместо a должна стоять b
ну да опечатка сори
Цитата Сообщение от Герц Посмотреть сообщение
От размера int'а данный пример не зависит,
серьезно?
а откуда взялось красивое число 5???
Цитата Сообщение от Герц Посмотреть сообщение
железного тут мало.
кроме процессоров Intel и платформы PC есть еще куча изделий
перенеси мне пожалуйста этот код хотя бы на ATMega 8535 или STM
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
достаёте свой аргумент.
или не достаете потому что компилятор забыл его положить
0
AntonChik
1084 / 582 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
04.07.2013, 12:04 #19
интересная тема.
Случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует (причины могут быть разные, но речь сейчас не о них). В этом случае можно не указывать имя ненужного параметра при определении функции. Сравните
C++
1
2
3
int f(int x, int y, int z) {
  return x+z;
}
и
C++
1
2
3
int f(int x, int, int z) {
  return x+z;
}
В последнем варианте тому, кто смотрит код, сразу ясно - о втором параметре функции не забыли, его не используют намеренно.
отсюда

может все-таки кто-нибудь поделиться причинами?
мне приходит на ум только то, что функция была виртуальной в базовом классе, но разве нельзя было просто ее перегрузить? отгрузить)))
1
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.07.2013, 12:09 #20
Цитата Сообщение от AntonChik Посмотреть сообщение
может все-таки кто-нибудь поделиться причинами?
причинами чего? ну не нужен нам 2-й аргумент и все тут
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
2
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
04.07.2013, 12:11 #22
Цитата Сообщение от Jupiter Посмотреть сообщение
причинами чего?
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
04.07.2013, 12:24 #23
Цитата Сообщение от Tulosba Посмотреть сообщение
Уважаемый Evg, не горячитесь так. Никто не утверждал, что этот код будет переносимым. Если Вам известны какие-то иные способы получения значения безымянного параметра, было бы интересно посмотреть.
Вместо того, чтобы городить кучу дополнительного кода в функции, могу предложить изящное решение - дать имя параметру.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Например, ты встраиваешься в чужую систему, которая пишется как универсальная на все случаи жизни. Поэтому ты обязан написать именно такой прототип функции, как требует того система. Поскольку система универсальная, а твой случай - частный, то тебе какие-то параметры могут и не понадобиться
2
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.07.2013, 12:24 #24
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
и чё? я вызываю функцию и мне пофигу что там используется, а что нет. если не я эту функцию писал
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 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;
}
Результат один и тот же.
Вопрос по прежнему открыт. Зачем существуют параметры без имени?
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
04.07.2013, 13:10 #26
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем существуют параметры без имени?
Просто так. Чтобы не заводить лишнее имя в процедуре, если параметр должен быть, но он не используется. Никаких других причин нет. Когда такое бывает - написал в посте #23.

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

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 13:53
Привет! Вот еще темы с ответами:

Локальные переменные в функции и её аргумент - C++
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...

Аргумент функции - массив строк - C++
есть массив строк string *conns = new string; нужно сделать функцию, которая его бы изменяла void func( ??? ) {}

Опциональный ссылочный аргумент функции - C++
Некоторые аргументы функции можно сделать опциональными, просто поставив значение по умолчанию, а затем проверяя, изменилось ли оно : ...

Аргумент argv в функции main() - C++
Здравствуйте. Возникли некоторые непонимания при работе с аргументом argv и указателями в целом. Мне сказали, что, при передаче...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.07.2013, 13:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru