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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Странное предупреждение GCC - C++

04.01.2013, 23:02. Просмотров 2206. Ответов 10
Метки нет (Все метки)

В функции есть строчки и компилятор ругается на последнуюю:
C
1
2
3
4
char *p = NULL;                                                                                             
char *ptr[n/2];                                                                                             
p = strtok(s, " \t\n\b");                                                                                   
ptr[0] = (char*)calloc((strlen(p)+1), sizeof(char));
Bash
1
test.c:21:21: warning: incompatible implicit declaration of built-in function ‘calloc’ [enabled by default]
Результат функции меня удовлетворят, но хотелось бы узнать существенна ли эта ошибка? И как её устанить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 23:02     Странное предупреждение GCC
Посмотрите здесь:

C++ gcc VS DEV-C++ 4.9.9.2
Компиляция (gcc) C++
Как понимать предупреждение комилятора gcc "ISO C++ says that these are ambiguous." C++
C++ gcc в c++ VS
g++/gcc не компилирует C++
gcc компиляция C++
C++ Глюк gcc?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12731 / 7191 / 802
Регистрация: 27.09.2012
Сообщений: 17,738
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 23:08     Странное предупреждение GCC #2
Лично у меня на этот фрагмент кода не ругается
Kastaneda
Форумчанин
Эксперт С++
4264 / 2796 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
04.01.2013, 23:08     Странное предупреждение GCC #3
Какие файлы инклюдишь?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.01.2013, 23:10  [ТС]     Странное предупреждение GCC #4
а практически никаких)

Добавлено через 28 секунд
разобрался спасибо
Kastaneda
Форумчанин
Эксперт С++
4264 / 2796 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
04.01.2013, 23:11     Странное предупреждение GCC #5
Тогда используется сишное объявление по умолчанию, где любая функция возвращает int. Нужно подключить <cstdlib>.
Croessmah
Модератор
Эксперт CЭксперт С++
12731 / 7191 / 802
Регистрация: 27.09.2012
Сообщений: 17,738
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 23:11     Странное предупреждение GCC #6
Цитата Сообщение от xtorne21st Посмотреть сообщение
разобрался спасибо
Ну так расскажите, может кому пригодится
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.01.2013, 23:16  [ТС]     Странное предупреждение GCC #7
Да вот, человек уже всё объяснил.
Kastaneda
Форумчанин
Эксперт С++
4264 / 2796 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
04.01.2013, 23:20     Странное предупреждение GCC #8
На буржуйской вики как раз про это написано
http://en.wikipedia.org/wiki/C_dynamic_memory_allocationAdding the cast may mask failure to include the header stdlib.h, in which the prototype for malloc is found.[8][9] In the absence of a prototype for malloc, the standard requires that the C compiler assume malloc returns an int. If there is no cast, a warning is issued when this integer is assigned to the pointer; however, with the cast, this warning is not produced, hiding a bug. On certain architectures and data models (such as LP64 on 64-bit systems, where long and pointers are 64-bit and int is 32-bit), this error can actually result in undefined behaviour, as the implicitly declared malloc returns a 32-bit value whereas the actually defined function returns a 64-bit value. Depending on calling conventions and memory layout, this may result in stack smashing. This issue is not present in modern compilers, as they uniformly produce warnings that an undeclared function has been used, so a warning will still appear. For example, GCC's default behaviour is to show a warning that reads "incompatible implicit declaration of built-in function" regardless of whether the cast is present or not.
Evg
Эксперт CАвтор FAQ
17317 / 5565 / 347
Регистрация: 30.03.2009
Сообщений: 15,129
Записей в блоге: 26
04.01.2013, 23:57     Странное предупреждение GCC #9
Смысл сей фичи в том, что в режиме -fbuiltin (который включен по умолчанию) компилятор gcc трактует большинство стандартных функций как builtin (т.е. встроенная в язык функция). В данном примере gcc пытается трактовать calloc как __builtin_calloc, но обламывается, видя, что прототип функции calloc не совпадает с прототипом __builtin_calloc. Почему не совпадает - описано выше.

Конкретно для calloc'а сия замена скорее всего не даёт ничего принципиального с точки зрения производительности. Скорее всего оптимизатор начинает понимать, что указатель, возвращённый calloc'ом является уникальным и не конфликтует ни с одним из существующих в точке вызова указателей. Но, например, для функции fabs замена на __builtin_fabs даст прирост в производительности, т.к. на большинстве архитектур __builtin_fabs раскроется в одну аппаратную операцию (а это гораздо эффективнее, чем вызов функции)
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
05.01.2013, 00:10  [ТС]     Странное предупреждение GCC #10
Хотя, как тут написано, что при приведении к типу - сообщения нет, у меня gcc 4.7 всё-равно выдаёт предупреждение.

Добавлено через 7 минут
До конца не дочитал, что на современные компиляторы не распространяется...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 12:07     Странное предупреждение GCC
Еще ссылки по теме:

Компиляция gcc C++
GotoXY в GCC C++
C++ Некорректное ли предупреждение gcc о явно запрещенном конструкторе?
C++ Gcc и c++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17317 / 5565 / 347
Регистрация: 30.03.2009
Сообщений: 15,129
Записей в блоге: 26
05.01.2013, 12:07     Странное предупреждение GCC #11
Цитата Сообщение от xtorne21st Посмотреть сообщение
Хотя, как тут написано, что при приведении к типу - сообщения нет, у меня gcc 4.7 всё-равно выдаёт предупреждение.
От того, что есть приведение типа, прототип функции другим не становится. А предупреждение касается именно прототипа функции, а не дальнейшей судьбы результата вызова
Yandex
Объявления
05.01.2013, 12:07     Странное предупреждение GCC
Ответ Создать тему
Опции темы

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