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

 
 
> 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
 
Start new topic
Ответов
Сергей Борщ
сообщение 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
vacvvn
сообщение Sep 23 2010, 06:05
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Сергей Борщ
сообщение Sep 23 2010, 09:42
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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
777777
сообщение Sep 23 2010, 11:08
Сообщение #5


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

Группа: Участник
Сообщений: 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
sKWO
сообщение Sep 23 2010, 11:15
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #7


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

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



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

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


Гуру
******

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



Цитата(777777 @ Sep 23 2010, 17:18) *
Это для переменных. Неужели по отношению к функциям это имеет такой же смысл?
Отнюдь! static для переменных кроме ограничения области видимости это еще и резервирование памяти (вместо размещения на стеке или в регистрах) и группировка переменных в Z-область данных, которая обнуляется при старте программы до вызова main.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Kris2007   warning: implicit declaration of function 'memset'   Sep 22 2010, 12:39
|- - Kris2007   Хм т.е. все сделано правильно?? И #include ...   Sep 23 2010, 05:50
||- - Сергей Борщ   Цитата(Kris2007 @ Sep 23 2010, 08:50) И ...   Sep 23 2010, 06:01
|- - 777777   Цитата(vacvvn @ Sep 23 2010, 10:05) выход...   Sep 23 2010, 06:18
|- - rezident   Цитата(777777 @ Sep 23 2010, 17:08) потом...   Sep 23 2010, 11:14
||- - sergeeff   Цитата(777777 @ Sep 23 2010, 14:18) Это д...   Sep 23 2010, 11:22
||- - MrYuran   Цитата(777777 @ Sep 23 2010, 15:18) Это д...   Sep 23 2010, 11:25
|- - Dima_G   Цитата(777777 @ Sep 23 2010, 18:08) Спаси...   Sep 23 2010, 15:32
- - Dima_G   Советую ознакомиться с http://ru.wikipedia.org/wi...   Sep 23 2010, 10:05
|- - MrYuran   Цитата(Dima_G @ Sep 23 2010, 14:05) Некот...   Sep 23 2010, 10:36
||- - Dima_G   Цитата(MrYuran @ Sep 23 2010, 17:36) Я вс...   Sep 23 2010, 10:49
|- - _Pasha   Цитата(Dima_G @ Sep 23 2010, 14:05) Некот...   Sep 23 2010, 11:22
|- - 777777   Цитата(_Pasha @ Sep 23 2010, 15:22) Приме...   Sep 23 2010, 11:25
|- - sKWO   Цитата(777777 @ Sep 23 2010, 14:25) Я пре...   Sep 23 2010, 11:57
|- - 777777   Цитата(sKWO @ Sep 23 2010, 15:57) ЦитатаЯ...   Sep 24 2010, 05:30
|- - sKWO   Цитата(777777 @ Sep 24 2010, 08:30) Ты зн...   Sep 29 2010, 05:23
|- - 777777   Цитата(sKWO @ Sep 29 2010, 09:23) А Вы зн...   Sep 29 2010, 17:01
|- - sKWO   Цитата(777777 @ Sep 29 2010, 20:01) Этот ...   Sep 30 2010, 05:54
|- - 777777   Цитата(sKWO @ Sep 30 2010, 09:54) Ну а ес...   Sep 30 2010, 06:12
|- - sKWO   Цитата(777777 @ Sep 30 2010, 09:12) Если ...   Sep 30 2010, 07:15
|- - Petka   Цитата(777777 @ Sep 30 2010, 10:12) Нет, ...   Sep 30 2010, 08:04
|- - 777777   Цитата(Petka @ Sep 30 2010, 12:04) Это за...   Sep 30 2010, 10:38
- - Petka   Цитата(Kris2007 @ Sep 22 2010, 16:39) ...   Sep 29 2010, 10:00
- - Juray   У меня почему-то линкер не ругался на глобальные п...   Sep 30 2010, 12:30
|- - IgorKossak   Цитата(Juray @ Sep 30 2010, 15:30) А вот ...   Sep 30 2010, 12:59
- - Juray   Чистый С. gcc - WinAVR 20050214. файл global.h: К...   Sep 30 2010, 13:14
- - IgorKossak   Странно, что работает. Грамотнее было бы U16 d_sta...   Sep 30 2010, 13:20
- - Juray   Да вот сам удивляюсь, читая эту ветку. Что грамот...   Sep 30 2010, 13:51
|- - 777777   Цитата(Juray @ Sep 30 2010, 17:51) Вам го...   Sep 30 2010, 15:24
|- - Juray   Цитата(777777 @ Sep 30 2010, 19:24) Ты ду...   Oct 1 2010, 11:56
|- - 777777   Цитата(Juray @ Oct 1 2010, 15:56) Сейчас ...   Oct 1 2010, 16:36
|- - mdmitry   Цитата(Juray @ Oct 1 2010, 15:56) Сейчас ...   Oct 2 2010, 08:29
- - rezident   Возможно та версия WinAVR не применяла раздельную ...   Sep 30 2010, 15:39
|- - 777777   Цитата(rezident @ Sep 30 2010, 19:39) Воз...   Sep 30 2010, 15:58
|- - rezident   Цитата(777777 @ Sep 30 2010, 21:58) То ес...   Sep 30 2010, 16:03
- - Juray   Предупреждения - по умолчанию. Этого недостаточно?...   Oct 2 2010, 08:44


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

 


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


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