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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.63
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

[C/C++] Смысл многоточия (...) - C++

05.08.2009, 14:40. Просмотров 5408. Ответов 13
Метки нет (Все метки)

Не мог бы кто-нибудь пояснить смысл данного явления в языке C и C++? Гугль конечно приводит в ступор поиск троеточий Я видел использование троеточия в try - catch ,а также в интерфейсе функции int scanf ( const char * format, ... ); Как именно компилятор понимает данную последовательность символов?И вообще,это оператор и есть ли у этого имя.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
558 / 552 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
05.08.2009, 14:43     [C/C++] Смысл многоточия (...) #2
Многоточие задает переменное число параметров. Посмотри пример здесь Функции в С
mik-a-el
CyberForum Owner
56984 / 36734 / 231
Регистрация: 10.04.2006
Сообщений: 12,652
05.08.2009, 14:43     [C/C++] Смысл многоточия (...) #3
http://linuxprograms.wordpress.com/2...erator-printf/
http://publib.boulder.ibm.com/infoce...s400clr155.htm
Evg
Эксперт CАвтор FAQ
17415 / 5653 / 355
Регистрация: 30.03.2009
Сообщений: 15,478
Записей в блоге: 26
05.08.2009, 15:16     [C/C++] Смысл многоточия (...) #4
Цитата Сообщение от #pragma Посмотреть сообщение
И вообще,это оператор и есть ли у этого имя.
Устоявшиеся названия: "ellipsis", "эллипс", "threedot", "три точки"
Phantom
Эксперт C++
3161 / 843 / 15
Регистрация: 29.12.2008
Сообщений: 952
05.08.2009, 15:32     [C/C++] Смысл многоточия (...) #5
Б. Страуструп. "Язык программирования С++", глава Функции, Неуказанное количество аргументов:
Для некоторых функций невозможно указать количество и типы всех аргументов. Список аргументов в объявлениях таких функций заканчивается многоточием (...), что означает "и может быть ещё несколько аргументов". Например:
C++
1
int printf(const char* ...);
Это означает, что вызов функции стандартной библиотеки C printf() должен содержать по крайней мере один аргумент типа char* и может либо содержать, либо не содержать ещё несколько аргументов.
Очень подробная глава, как раз по теме, советую почитать.
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
05.08.2009, 17:45     [C/C++] Смысл многоточия (...) #6
http://www.cplusplus.com/reference/c...stdarg/va_arg/
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
06.08.2009, 17:08     [C/C++] Смысл многоточия (...) #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   
 char* s_print_f (char* _dest, char* format,...) {
     char* pdest = _dest;
     char* pt;
     char buffer [10];
     char** ptr = &format;
     char* p = format;
 
     for ( ; *p ; p++) {
 
        if (*p == '%') {
           switch (*(p++ +1)) {
            case 'd':
              ltoa((long) *++ptr, buffer, 10);
               pt = buffer;
              while (*pt) *pdest++ = *pt++;
              break;
 
             case 's':
               pt = *++ptr;
              while (*pt) *pdest++ = *pt++;
             break;
 
             case 'c':
             *pdest++ = (char) *++ptr;
             break;
         }
     }
     else  *pdest++=*p ;
     }
     *pdest = '\0';
     return _dest;
  }
примитивное подобие форматного вывода, но создает общее впечатление о работе функции с переменным числом параметров.
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
06.08.2009, 20:27     [C/C++] Смысл многоточия (...) #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
// приметивная функция нахождения сумы
// первий параметр количество елементов
int sum(int count, ...){
    int s = 0;
    for(int i = 1; i <= count; ++i){
            s += (&count)[i];        
    }
    return s;
}
 
int main(){
    cout << sum(3, 20, 30, 40) << endl;
    system("pause");
    return 0;   
}
Evg
Эксперт CАвтор FAQ
17415 / 5653 / 355
Регистрация: 30.03.2009
Сообщений: 15,478
Записей в блоге: 26
06.08.2009, 20:37     [C/C++] Смысл многоточия (...) #9
DreamWolf, попробуй свой пример на 64-разрядной машине скомпилять. Или на любой другой процессор, отличный от Intel. За такие примеры вообще канделябром надо бить
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
06.08.2009, 21:15     [C/C++] Смысл многоточия (...) #10
попробуй свой пример на 64-разрядной машине скомпилять.
Никогда не компелировал, а что не работает?
Или на любой другой процессор, отличный от Intel.
Ти имееш ввиду другой компании (тогда работает) или другой архитектури (тогда не знаю)?
За такие примеры вообще канделябром надо бить
Не понял что ти имел ввиду.
Evg
Эксперт CАвтор FAQ
17415 / 5653 / 355
Регистрация: 30.03.2009
Сообщений: 15,478
Записей в блоге: 26
06.08.2009, 22:42     [C/C++] Смысл многоточия (...) #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
> Не понял что ти имел ввиду

Ты написал некорректный код. Кто тебе сказал, что второй параметр после count лежит в памяти и кто сказал, что он лежит в памяти впритык за count? По программным соглашениям на архитектуре параметры могут передаваться на регистрах, а все эти знания и заключены в макросе va_arg, который на каждой архитектуре имеет свою реализацию
Phantom
Эксперт C++
3161 / 843 / 15
Регистрация: 29.12.2008
Сообщений: 952
06.08.2009, 23:07     [C/C++] Смысл многоточия (...) #12
DreamWolf, я бы вот так твой пример переписал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdarg.h>
using namespace std;
 
// приметивная функция нахождения сумы
// первий параметр количество елементов
int sum(int count,...)
{
    va_list ap;
    int s = 0;
    va_start(ap,count);
    for(int i=0;i<count;i++) s+=va_arg(ap,int);
    va_end(ap);
    return s;
}
 
int main()
{
    cout << sum(3, 20, 30, 40) << endl;
    system("pause");
    return 0;   
}
Evg, правильно говорит, нужно макрос va_arg использовать.

Вот как раз в тему: информация про эти макросы.
http://msdn.microsoft.com/en-us/libr...d8(VS.71).aspx
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
07.08.2009, 00:36     [C/C++] Смысл многоточия (...) #13
#pragma,
в VC++ с версии 8.0 и gcc c 4-какой-то позволяют использовать троеточние в макросах. это означает, что туда можно передать переменной число параметров.

например:
C++
1
2
3
4
5
#ifdef _DEBUG
#define dprintf(fmt, ...) printf(fmt, __VA_ARG__)
#else
#define dprintf(fmt, ...) ((void) 0)
#endif
использование - так же как и printf:
dprintf("%s %d", "Hello", 123);

без такой поддержки раньше обычно обходились извратами

C++
1
2
3
4
5
6
7
#ifdef _DEBUG
#define dprintf(args) printf args
#else
#define dprintf(args) ((void) 0)
#endif
 
dprintf(("%s %d", "Hello", 123));
с новом стандарте C++0x обещают прикрутить поддержку многоточия в шаблонах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2009, 08:38     [C/C++] Смысл многоточия (...)
Еще ссылки по теме:

C++ Смысл выражения
C++ Смысл обьединений
Есть ли смысл в блоках? C++
В чем смысл полиморфизма C++
Смысл использования полиморфизма C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17415 / 5653 / 355
Регистрация: 30.03.2009
Сообщений: 15,478
Записей в блоге: 26
07.08.2009, 08:38     [C/C++] Смысл многоточия (...) #14
Цитата Сообщение от Rififi Посмотреть сообщение
и gcc c 4-какой-то
В gcc ещё версии 2.95 была поддержка трёх точек в макросах. Но я бы не стал этим злоупотреблять без великой необходимости, если программа будет переносится на другие компиляторы. Тот же самый dprintf я бы реализовал в виде функции с пустым телом в режиме без отладки. Немного лишнего кода в боевой версии, но меньше проблем с переносимостью
Yandex
Объявления
07.08.2009, 08:38     [C/C++] Смысл многоточия (...)
Ответ Создать тему
Опции темы

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