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

Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"? - C++

Восстановить пароль Регистрация
 
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
11.02.2014, 09:13     Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"? #1
Действительно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdarg.h>
 
int foo (char* k,...) {
  va_list ap;
  va_start (ap, k);
  char x= va_arg (ap, char);
  va_end (ap);
}
 
int main(){
    return 0;
}

In function 'int foo(char*, ...)':
[Warning] 'char' is promoted to 'int' when passed through '...' [enabled by default]
(so you should pass 'int' not 'char' to 'va_arg')
if this code is reached, the program will abort

Короче, всё плохо. У K&R такого ограничения нет, в стандарте тоже:
8.3.5
...
the declaration
int printf(const char*, ...);
declares a function that can be called with varying numbers and types of arguments.
В чём же дело? Может, надо использовать какие-нибудь опции компилятора? g++ 4.6.2
Спасибо, кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 09:13     Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"?
Посмотрите здесь:

возвращаемый тип "main" должен быть "int", а не C++
МАССИВЫ: динамические мас.значение типа "int *" нельзя присвоить сущности типа "int" C++
C++ Error: значение типа "const char" нельзя присвоить сущности типа "double"
C++ vs2010 разница между "int _tmain()" и "int main()"
C++ Что делать с ошибкой: C2440: инициализация: невозможно преобразовать "int **" в "int *"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
11.02.2014, 17:28     Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"? #21
kravam, тогда остается только предположить полную невменяемость транслятора. Я взял твой код, прогнал через старинный BC 2.0 - вякнул только, что х не используется....
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 17:33     Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"?
Еще ссылки по теме:

невозможно преобразовать параметр 1 из "int" в "int *&" C++
C++ Ошибка: "Значение типа float нельзя присвоить сущности типа int"
Аргумент типа "int **" несовместим с параметром типа "int (*)[26]" C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
11.02.2014, 17:33  [ТС]     Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"? #22
Цитата Сообщение от Байт Посмотреть сообщение
kravam, тогда остается только предположить полную невменяемость транслятора. Я взял твой код, прогнал через старинный BC 2.0 - вякнул только, что х не используется....
Ну зачем же так грубо... Дай вывод этого кода:

C++
1
2
3
4
5
6
7
8
#include  <stdio.h>
 
////////////////////////////////////
 
int main () {
 printf ("%d %d\n", sizeof (char), sizeof (bool));
 getchar ();
}
Yandex
Объявления
11.02.2014, 17:33     Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"?
Ответ Создать тему
Опции темы

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