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

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

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
603 / 496 / 99
Регистрация: 27.01.2015
Сообщений: 2,908
Записей в блоге: 1
Завершенные тесты: 1
#1

Могут ли теоретически существовать методы с неопределенным числом аргументов? - C++

01.08.2015, 19:49. Просмотров 1130. Ответов 47
Метки нет (Все метки)

Разумно ли использовать va args в таких ситуациях?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 19:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Могут ли теоретически существовать методы с неопределенным числом аргументов? (C++):

Определить классы которые могут существовать только на стеке/динамически/которые нельзя копировать - C++
Определить 3 класса. 1. Объекты могут существовать только локально на стеке (как это понять?). 2. Объекты могут существовать только в...

Чем могут отличаться формальные параметры функции от ее аргументов? - C++
Если кто знает может помочь ответить на вопросы. Заранее спасибо 1 . Чем могут отличаться формальные параметры функции от ее аргументов ?...

Шаблоны с переменным числом аргументов - C++
Написал шаблон функции с переменным числом аргументов которая считает сумму своих аргументов. Практики по этому вопросу не имею, поэтому...

Функция с неуказанным числом аргументов - C++
Всем привет! Попытался реализовать функцию, которая выводит свои аргументы(все, кроме первого), но когда запускаю, она дополнительно ещё...

Функции с переменным числом аргументов - C++
на пример sum(2,56,515,-23.65,548)?

GCC и функции с переменным числом аргументов - C++
Писал мини приложение в студии для работы с векторами, один из методов просто получает сколько угодно аргументов и заполняет координаты...

47
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
02.08.2015, 16:42 #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя, где-то я натыкался на упоминание того, что в GСС и printf сделали безопасным к типам
Этого в принципе нельзя сделать. То, что сделано в gcc, это контроль со стороны компилятора в точке вызова printf'а при условии, что формат задан в виде строкового литерала. Понятно, что такими warning'ами накрывается 99% жизненных случаев, но это никак не технология безопасности. Между высоким уровнем (концепцией си++) и низким (концепция си) всегда есть соотношение: чем ниже уровень, тем меньше безопасности (в том смысле, что больше вещей перекладывается на программиста), но больше гибкости
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.08.2015, 20:50 #17
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности
А что же это тогда, если я явно получаю предупреждение в момент компиляции в случае несоответствия типов в формате и аргументов? Понятно, что это всё-таки предупреждение, а не ошибка, но дело тут в первую очередь именно в обнаружении ситуации на ранней стадии.
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
02.08.2015, 23:40 #18
В таком примере сия технология ничего не обнаружит

C
char *format = "%s";
...
printf (format, 1);
да и вытекает оно вовсе не из каких-то особенностей языка (как это имеет место быть в Си++), а из дополнительных необязательных возможностей компилятора. Да, она в 99% решит проблему. Но это только в компиляторе gcc, в других-то такого может и не быть. В то время как в Си++ все компиляторы отработают одинаково из-за свойств языка
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.08.2015, 09:06 #19
Цитата Сообщение от Evg Посмотреть сообщение
В таком примере сия технология ничего не обнаружит
Потому что в таком примере обработка формата по сути выносится в run-time.
На сях вероятно стоило бы использовать #define, а не char* для обеспечения проверки в compile-time.
А вот на C++ правильно объявить указатель на строку формата:
C++
1
const char* const format = "%s";
После чего механизм проверки типов в printf снова вернется к работе во время компиляции.
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
03.08.2015, 11:58 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
А вот на C++ правильно объявить указатель на строку формата
А кто тебе сказал, что форматная строка является константной? Она точно так же может генерироваться в runtime
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.08.2015, 12:10 #21
Цитата Сообщение от Evg Посмотреть сообщение
Она точно так же может генерироваться в runtime
Может. Но когда я первый раз упомянул printf gcc'шный в этой теме речь шла именно про compile-time (сообщение #15).
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
03.08.2015, 12:14 #22
Так потому я и говорю, что это не технология безопасности, а поделка. Она в большинстве жизненных случаев поймает пользователя за руку. Но не всегда. И не на всех компиляторах. В то время как подход Си++ попросту не даст возможности пользователю выстрелить себе в ногу. Но платой за это является потеря гибкости при работе и навязанная необходимость всё делать через шаблоны и огромное количество кода в хидерах
0
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,367
Завершенные тесты: 1
03.08.2015, 12:17 #23
Цитата Сообщение от Tulosba Посмотреть сообщение
const char* const format = "%s";
граммар конст?
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
03.08.2015, 12:17 #24
Думается, для условного my_printf (которая не обязательно занимается печатью) с динамически сгенерированной форматной строкой для Си++ вменяемого аналога нет (как в своё время не было variadic template'ов). Пока это не будет статистически значимым, в Си++ никто не будет чего-то вносить по этому поводу. Но если вдруг понадобится, то может и придумают очередную монстровую конструкцию
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.08.2015, 13:03 #25
Цитата Сообщение от hoggy Посмотреть сообщение
граммар конст?
Да, чтоб сообщение компилятора получить.
Цитата Сообщение от Evg Посмотреть сообщение
это не технология безопасности, а поделка.
Тут, имхо, вопрос терминологии. Что считать "технологией", а что нет.
Например, если поделку стандартизировать, будет ли она считаться технологией по твоему мнению?
Я тут не делал различий, наверное поэтому фраза
Цитата Сообщение от Evg Посмотреть сообщение
но это никак не технология безопасности.
меня и смутила.
1
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
03.08.2015, 13:10 #26
Цитата Сообщение от Tulosba Посмотреть сообщение
Например, если поделку стандартизировать, будет ли она считаться технологией по твоему мнению?
Я уже писал выше о том, что этого в принципе сделать невозможно. Потому что форматная строка может быть сгенерирована в runtime. А потому оно так и останется на всегда доброй волей разработчиков компилятора, а никак не стандартом.

Да и работает оно, строго говоря, некорректно. Если подать формат %d, а значение подавать типа unsigned, то с точки зрения стандарта код некорректен, но по факту такая комбинация используется широко и повсеместно, из-за чего gcc'шники в подобных случаях предупреждения не выдают

C
1
2
3
4
5
6
7
#include <stdio.h>
 
void foo (unsigned x)
{
  printf ("%d\n", x);
  printf ("%ld\n", x);
}
Код
$ gcc t.c -c -Wall
t.c: In function 'foo':
t.c:6:3: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'unsigned int' [-Wformat=]
   printf ("%ld\n", x);
т.е. обе строки формально некорректны, но предупреждение выдаётся только на вторую

В технологиях, используемых в Си++ невозможно отвязать значение от типа, а потому подобные моменты там в принципе возникнуть не могут. Поэтому вариант из Си++ уже тянет на то, чтобы назвать его словом "технология"
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
03.08.2015, 14:24 #27
Цитата Сообщение от Evg Посмотреть сообщение
Но платой за это является потеря гибкости при работе
Если ты про форматную строчку, то её точно так же можно использовать и с variadic template'ами. Код немного посложнее конечно будет
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
03.08.2015, 14:41 #28
Касательно вариадиков, помните, что можно все делать без рекурсии.

C++
1
2
3
4
5
6
7
template<typename... Args>
void print(const Args&... args)
{
   using swallow = int[];
   swallow{0, (std::cout << args << ' ', void(), 0)...};
   std::cout << std::endl;
}
7
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,367
Завершенные тесты: 1
03.08.2015, 15:17 #29
Цитата Сообщение от Tulosba Посмотреть сообщение
Да, чтоб сообщение компилятора получить.
значит это и сегодня тоже актуально)
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
03.08.2015, 15:19 #30
Цитата Сообщение от Voivoid Посмотреть сообщение
Если ты про форматную строчку
Я, например, про то, что я вот хочу иметь функцию в отдельном файле *.c (*.cc) и в хидере иметь только extern-описание функции. Идеология шаблонов Си++ накладывает ограничение в виде того, что так я сделать не могу
0
03.08.2015, 15:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 15:19
Привет! Вот еще темы с ответами:

Шаблонная функция с переменным числом аргументов - C++
Сабж. Каким образом можно запретить использование шаблонной функции, если тип одного из аргументов не соответствует требуемому? Есть...

Инициализация std::tuple переменным числом аргументов - C++
Добрый вечер. Мне нужно инициализировать объект std::tuple, который является членом некоторого другого шаблонного класса с переменным...

Функция с переменным числом аргументов (через шаблоны) - C++
Доброго времени суток! Встал вопрос с реализацией такой функции. template&lt;typename... Args&gt; returntype functionname(const Args&amp;......

Шаблон с переменным числом аргументов, и возвращаемое значение функции - C++
Здравствуйте! Использую С++11. Хочу возвращать элементы кортежа пытаюсь так, auto Deserialize(unsigned long long i) -&gt;...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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