реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> warning: implicit declaration of function 'memset', почему лишь warning и почему все работает?
Kris2007
сообщение Sep 22 2010, 12:39
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Правлю чужой код. AVR-GCC, Atmega128
При компиляции выдает море warning-ов на memset, memcpy и.т.п.
Проблему ли в том что нет #include "string.h".

Например:
../utils.c:47: warning: implicit declaration of function 'memset'
../utils.c:47: warning: incompatible implicit declaration of built-in function 'memset'


Но! Стало любопытно, ведь устройства с прошивкой продаются и вроде работают)
Почему, что сотворил компилятор?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 22 2010, 12:44
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kris2007 @ Sep 22 2010, 15:39) *
Почему, что сотворил компилятор?
При известных на этапе компиляции параметрах он генерит встроенные оптимальные (под конкретные параметры) тела функций вместо вызова библиотек. В противном случае споткнулся бы линкер.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kris2007
сообщение Sep 23 2010, 05:50
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Хм т.е. все сделано правильно??
И #include "string.h" не стоит добавлять?

Сообщение отредактировал Kris2007 - Sep 23 2010, 05:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 23 2010, 06:01
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kris2007 @ Sep 23 2010, 08:50) *
И #include "string.h" не стоит добавлять?
Не каждого, переходящего на красный свет сбивает машина. Стоит всегда переходить на красный свет?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vacvvn
сообщение Sep 23 2010, 06:05
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 17-09-10
Пользователь №: 59 547



Цитата(Сергей Борщ @ Sep 22 2010, 16:44) *
При известных на этапе компиляции параметрах он генерит встроенные оптимальные (под конкретные параметры) тела функций вместо вызова библиотек. В противном случае споткнулся бы линкер.

выходит, этот трюк можно использовать для снижения объема кода(если кроме простых memset, memcpy и т д, функций не зовешь)? Не включаешь #include "string.h" и библиотека не занимает места?
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 23 2010, 06:18
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(vacvvn @ Sep 23 2010, 10:05) *
выходит, этот трюк можно использовать для снижения объема кода(если кроме простых memset, memcpy и т д, функций не зовешь)? Не включаешь #include "string.h" и библиотека не занимает места?

А она и так не занимает места. Не думаешь ли ты, что включение какого-то h-файла может что-то добавить к твоему коду? В них хранятся лишь декларации, необходимые компилятору, которые не порождают ни код, ни переменных.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 23 2010, 09:42
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(vacvvn @ Sep 23 2010, 09:05) *
Не включаешь #include "string.h" и библиотека не занимает места?
Возможно я неясно выразился: Включать string.h, конечно, нужно. Просто в некоторых тривиальных случаях компилятор может вместо вызова библиотечной функции вставить прямо в код ее оптимизированную под конкретный случай версию. А если случай нетривиальный (один из параметров - переменная и ее значение неизвестно на этапе компиляции) он вызовет библиотечную функцию.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Sep 23 2010, 10:05
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Советую ознакомиться с
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%...%86%D0%B8%D0%B8

А вообще - ИМХО это бадстайл (функции без прототипа)

Цитата(777777 @ Sep 23 2010, 13:18) *
А она и так не занимает места. Не думаешь ли ты, что включение какого-то h-файла может что-то добавить к твоему коду? В них хранятся лишь декларации, необходимые компилятору, которые не порождают ни код, ни переменных.

Некоторые талантливые программисты могут вставлять в заголовочный файл декларации переменных. biggrin.gif
В таком случае, естественно размер кода будет увеличен
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 23 2010, 10:36
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Dima_G @ Sep 23 2010, 14:05) *
Некоторые талантливые программисты могут вставлять в заголовочный файл декларации переменных. biggrin.gif
В таком случае, естественно размер кода будет увеличен

Я вставляю реализацию функций static inline.
Что имеете против?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Sep 23 2010, 10:49
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(MrYuran @ Sep 23 2010, 17:36) *
Я вставляю реализацию функций static inline.
Что имеете против?

функция != переменная
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 23 2010, 11:08
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Сергей Борщ @ Sep 23 2010, 13:42) *
Возможно я неясно выразился: Включать string.h, конечно, нужно. Просто в некоторых тривиальных случаях компилятор может вместо вызова библиотечной функции вставить прямо в код ее оптимизированную под конкретный случай версию. А если случай нетривиальный (один из параметров - переменная и ее значение неизвестно на этапе компиляции) он вызовет библиотечную функцию.

Я извиняюсь, но параметры - практически всегда переменные, но это не препятствие для встраивания тела функции в код. Может memset не самый удачный пример из-за того, что память обычно заполняют какой-то константой, но вот функцию abs() глупо вызывать, передавая ей в качестве параметра константу, согласись. Тем не менее она ведет себя так же - компилятор о ней занет даже без прототипа и встраивает ее тело прямо в код.

Цитата(Dima_G @ Sep 23 2010, 14:05) *
Советую ознакомиться с
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%...%86%D0%B8%D0%B8


Спасибо, я уже закончил детский сад

Цитата(Dima_G @ Sep 23 2010, 14:05) *
Некоторые талантливые программисты могут вставлять в заголовочный файл декларации переменных. biggrin.gif
В таком случае, естественно размер кода будет увеличен

От деклараций (declaration) переменных ни код, ни озу не увеличится. он может увеличиться от определений (definition) переменных или функций. Но это, действительно могут делать только очень талантливые программисты, потому что стоит этот h-файл включить в два c-файла, как линкер выдаст ошибку о том, что в программе имеются несколько переменных с одинаковым именем.

Цитата(MrYuran @ Sep 23 2010, 14:36) *
Я вставляю реализацию функций static inline.
Что имеете против?

Инлайновые функции с точки зрения компилятора являются declaration. Однако, если вы присвоете ее адрес какому-нибудь указателю на функцию, то она станет обычной функцией со всеми вытекающими отсюда последствиями.

ЗЫ. static имеет много значений в C в зависимости от контекста, а что он означает применительно к функции? Я полагаю имеется в виду pure-С?
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 23 2010, 11:14
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(777777 @ Sep 23 2010, 17:08) *
потому что стоит этот h-файл включить в два c-файла, как линкер выдаст ошибку о том, что в программе имеются несколько переменных с одинаковым именем.
Если они объявлены как static, то промолчит, проглотит и не поперхнется.
Цитата(777777 @ Sep 23 2010, 17:08) *
ЗЫ. static имеет много значений в C в зависимости от контекста, а что он означает применительно к функции?
static применительно к функции? - ограничивает ее область видимости вроде как.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Sep 23 2010, 11:15
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(777777 @ Sep 23 2010, 14:08) *
ЗЫ. static имеет много значений в C в зависимости от контекста, а что он означает применительно к функции? Я полагаю имеется в виду pure-С?

static - как по мне : ограничение видимости в пределах файла


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 23 2010, 11:18
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(sKWO @ Sep 23 2010, 15:15) *
static - как по мне : ограничение видимости в пределах файла

Это для переменных. Неужели по отношению к функциям это имеет такой же смысл?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 23 2010, 11:22
Сообщение #15


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Dima_G @ Sep 23 2010, 14:05) *
Некоторые талантливые программисты могут вставлять в заголовочный файл декларации переменных. biggrin.gif

Пример. Поддержка 7-сегментного индикатора. Кроме знакогенератора и определения собсна цифр как совокупности сегментов там ничего нет. Предлагаете знакогенератор определять где-то в другом месте, а в хедере описывать только как extern? biggrin.gif
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 20:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01674 секунд с 7
ELECTRONIX ©2004-2016