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

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

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

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

04.01.2013, 23:02. Просмотров 2613. Ответов 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]
Результат функции меня удовлетворят, но хотелось бы узнать существенна ли эта ошибка? И как её устанить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 23:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное предупреждение GCC (C++):

Некорректное ли предупреждение gcc о явно запрещенном конструкторе? - C++
Здравствуйте! У меня есть класс Uncopyable, который явно запрещает копирование. От него наследую класс, в котором есть указатели, и...

Как понимать предупреждение комилятора gcc "ISO C++ says that these are ambiguous." - C++
предупреждение: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion...

[gcc] отказался подавлять предупреждение -Wunused-function - C++
добрый день. есть подозрение на баг в компиляторах gcc. (воспроизводил на разных версиях) хотя допускаю, что возможно я сам...

Gcc и c++ - C++
Доброго времени суток. Начну с предисловия. Я всегда писал на C++ под винду и в линукс не совался. Сейчас, я выполняю задание(тестовое) и...

gcc в c++ VS - C++
void MakeStrRef(RCString* sref,char* data){ asm("pushl %%eax\n" "call %%edx" : ...

Компиляция (gcc) - C++
Добрый вечер! После компиляции текстовый файл становится вдруг двоичным, как следствие его невозможно открыть для исправлений. Почему? ...

10
Croessmah
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,891
Записей в блоге: 3
Завершенные тесты: 1
04.01.2013, 23:08 #2
Лично у меня на этот фрагмент кода не ругается
1
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 23:08 #3
Какие файлы инклюдишь?
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.01.2013, 23:10  [ТС] #4
а практически никаких)

Добавлено через 28 секунд
разобрался спасибо
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 23:11 #5
Тогда используется сишное объявление по умолчанию, где любая функция возвращает int. Нужно подключить <cstdlib>.
0
Croessmah
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,891
Записей в блоге: 3
Завершенные тесты: 1
04.01.2013, 23:11 #6
Цитата Сообщение от xtorne21st Посмотреть сообщение
разобрался спасибо
Ну так расскажите, может кому пригодится
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.01.2013, 23:16  [ТС] #7
Да вот, человек уже всё объяснил.
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
04.01.2013, 23:20 #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.
1
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,244
Записей в блоге: 28
04.01.2013, 23:57 #9
Смысл сей фичи в том, что в режиме -fbuiltin (который включен по умолчанию) компилятор gcc трактует большинство стандартных функций как builtin (т.е. встроенная в язык функция). В данном примере gcc пытается трактовать calloc как __builtin_calloc, но обламывается, видя, что прототип функции calloc не совпадает с прототипом __builtin_calloc. Почему не совпадает - описано выше.

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

Добавлено через 7 минут
До конца не дочитал, что на современные компиляторы не распространяется...
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,244
Записей в блоге: 28
05.01.2013, 12:07 #11
Цитата Сообщение от xtorne21st Посмотреть сообщение
Хотя, как тут написано, что при приведении к типу - сообщения нет, у меня gcc 4.7 всё-равно выдаёт предупреждение.
От того, что есть приведение типа, прототип функции другим не становится. А предупреждение касается именно прототипа функции, а не дальнейшей судьбы результата вызова
1
05.01.2013, 12:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 12:07
Привет! Вот еще темы с ответами:

gcc компиляция - C++
Проблема возникла при компиляции проекта code::block. При build and run все работает, в папке bin проекта появляется .exe Но...

Глюк gcc? - C++
Компилируя программу в gcc, выводит от части неверный ответ. В code::blocks все в порядке. Как это понимать? Программа выполняет сдвиг...

g++/gcc не компилирует - C++
есть С++ код #include &lt;iostream&gt; int main(){ std::cout &lt;&lt; &quot;hello ,world!&quot;; } запускаю компилятор и он ничего не...

Компиляция gcc - C++
Подскажите как в VS скомпилировать программу с помощью компилятора gcc


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

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

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