Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 269

Значения по умолчанию в функциях С++

04.12.2016, 14:02. Показов 4870. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема на пустом месте, а именно с параметрами по умолчанию, чтобы не передавать в функцию "лишнии" значения.
Имеем например функцию:
Code
1
2
3
4
uint16 mcp3201_read_for_delay(uint16 *in, uint16 out=0xffff)
{
.....
}
в хидере:
Code
1
extern uint16 mcp3201_req_read_for_delay(uint16 *, uint16);
если её вызывать с двумя параметрами нет проблем нигде, а если вызывать только с одним параметром и где нибудь в другом файле (если в этом же, то проблем также нет) возникает беда :) компилятор упорно просит второй параметр.
Вродебы можно обьявить функцию в начале фала в котором предполагается использование, но как то кажеться это неправильно.
Как правильно сделать, чтобы вызывать функцию с произвольным числом параметров в других файлах проекта?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2016, 14:02
Ответы с готовыми решениями:

Значение по умолчанию в функциях
Пишу int __fastcall TFMain::Tets(int x=2) { return x; } Компилятор выдает: Default argument value redeclared for parameter 'x'...

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

Параметры по-умолчанию в виртуальных функциях
Подскажите, это ведь UB ? #include <iostream> class Base { int a; public: Base() : a(1) {}

10
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
04.12.2016, 14:22
А почему вы дефолтный параметр в определении функции пишете, а не в объявлении (в строчке с extern)?
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
04.12.2016, 14:22
в заголовке указать:

Code
1
uint16 mcp3201_read_for_delay(uint16 *in, uint16 out=0xffff);
в файле .cpp:

Code
1
2
3
4
uint16 mcp3201_read_for_delay(uint16 *in, uint16 out)
{
...
}
в других файлах компилятор видит только заголовки и есессно не понимает, что от него хотят.

P.S. extern у функций в данном случае бессмыслен.
Declarations of variables omd functions at file scope are external by default.
0
0 / 0 / 0
Регистрация: 20.06.2011
Сообщений: 269
04.12.2016, 15:41
Stiit.mi, если я правильно вас понял, то я про такой вариант написал, но в каждом файле *.cpp, где мне использовать функцию писать:
Code
1
uint16 mcp3201_read_for_delay(uint16 *in, uint16 out=0xffff);
(если в хидере то ругается компилятор)
как то ненравиться штоли, можно через макрос указать и значение по умолчанию, чтоб одинаково во всех файла было, но в стандартных библиотеках как то же сделано или чтобы так сделать нужны классы?
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
04.12.2016, 15:52
Цитата Сообщение от ITIKTROS
(если в хидере то ругается компилятор)
Только в хедере.

как то ненравиться штоли, можно через макрос указать и значение по умолчанию, чтоб одинаково во всех файла было, но в стандартных библиотеках как то же сделано или чтобы так сделать нужны классы?
Если программируя на С++ тебе захотелось использовать макросы, то практически гарантированно ты делаешь что-то не так.
0
0 / 0 / 0
Регистрация: 17.01.2016
Сообщений: 44
04.12.2016, 17:03
Цитата Сообщение от ITIKTROS
Возникла проблема на пустом месте, а именно с параметрами по умолчанию, чтобы не передавать в функцию "лишнии" значения.
Передаваться будут все параметры. Компилятор лишь подставит в соответствующем случае значение по умолчанию.

Цитата Сообщение от ITIKTROS
Как правильно сделать, чтобы вызывать функцию с произвольным числом параметров в других файлах проекта?
Всё, к чему даётся доступ из других "файлов" проекта - должно описываться в "интерфейсе" этого "файла" - в его .h Компилятор видит только то, что в объявлено/реализовано в этом файле + то, что объявлено во включаемых файлом заголовках. То, что лежит в параллельных файлах проекта - ему неведомо.
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
05.12.2016, 12:50
Если программируя на С++ тебе захотелось использовать макросы, то практически гарантированно ты делаешь что-то не так.
C++ является мультипарадигмальным языком в широком смысле этого слова. У него нет строгого предписания по использования, как, допустим, у питона.
Нет ничего плохого в том, чтобы писать на С++ с использованием макросов.

Особенно часто это касается программ, написанных на 70% на языке Си и на 30% на С++. Там использование сишных макросов в коде С++ является и вовсе естественным.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
05.12.2016, 13:38
Цитата Сообщение от Myrmyk
C++ является мультипарадигмальным языком в широком смысле этого слова. У него нет строгого предписания по использования, как, допустим, у питона.
Нет ничего плохого в том, чтобы писать на С++ с использованием макросов.

Особенно часто это касается программ, написанных на 70% на языке Си и на 30% на С++. Там использование сишных макросов в коде С++ является и вовсе естественным.
Сейчас компиляторы уже часть функционала из C++17 поддерживают, но конечно можно писать и на С++98, только вряд ли можно сказать, что в этом нет ничего плохого. То же самое можно сказать и про макросы. Они как бы есть, но необходимости в этой устаревшей части языка практически нет. Конечно если у тебя проект на С++ к которому подключено множество стандартных хедеров на С с макросами, то их придется использовать, я лишь говорю, что не стоит вместо inline функции, шаблона или простой константы лепить уже свои макросы, тем более после появления модулей, которые уже есть в VS, другого пути просто не останется, т.к. макросы за пределами модулей просто не видны.
0
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
05.12.2016, 13:45
Единственное в макросах - возможность указания значения при компиляции ключём. Ну не сделаешь ты этого ни в C++17, ни где ещё. Так что макросы пока что ещё живут.

Пример: сборка прошивки под разные ревизии платы с разными кварцами.
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
05.12.2016, 14:24
Цитата Сообщение от dikor
Единственное в макросах - возможность указания значения при компиляции ключём. Ну не сделаешь ты этого ни в C++17, ни где ещё. Так что макросы пока что ещё живут.

Пример: сборка прошивки под разные ревизии платы с разными кварцами.
Ну правильно, макросы живут в какой-то своей небольшой нише. Директивы условной компиляции тоже постепенно сдают позиции после появления всяких "constexpr if"...
0
SOO
05.12.2016, 20:01
2 ITIKTROS:

То что вы хотите сделать в языках программирования высокого уровня называется - перегруженные функции. Гуглите в эту сторону.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2016, 20:01
Помогаю со студенческими работами здесь

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

Использование значения в разных функциях
Нужно объявить переменные через if и Path.Combine так чтобы в разных воидах их использовать. Это поможет мне сократить объем кода в разы и...

Обязателен ли return в функциях типа void? Нужен ли он в нерекурсивных функциях?
Вот код в STM32 CUBEIDE. Изначально разработчик не писал строчку return, но меня учили что она обязательна. Есть ли разница в данном...

Значение полей по умолчанию : "нет значения поля по умолчанию"; "Null";"0"
Форумчане, доброго времени суток! Подскажите. пожалуйста, как правильно указывать значение поля по умолчанию в таблице Аксесс 2003?? ...

Значения по умолчанию
Доброго дня! Подскажите как при открытии документа каждый раз некоторые ячейки сбрасывались на умолчальные. Например ячейка с выбором...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru