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

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


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-03-06
Из: Йошкар-Ола
Пользователь №: 15 388



У меня почему-то линкер не ругался на глобальные переменные (не static), определённые (не объявленные!) в одном заголовочнике, на который куча файлов ссылается. (Да, быдлокод - это я сейчас понимаю, но переделывать уже поздно - "работает - не трогай".)

А вот на попытку сделать глобальной константу (const) - таки ругается. (Это я тогда еще не знал о progmem).

Сообщение отредактировал Juray - Sep 30 2010, 12:59
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 30 2010, 12:59
Сообщение #32


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Juray @ Sep 30 2010, 15:30) *
А вот на попытку сделать глобальной константу (const) - таки ругается.

С или С++?
И примерчик приведите.
Go to the top of the page
 
+Quote Post
Juray
сообщение Sep 30 2010, 13:14
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-03-06
Из: Йошкар-Ола
Пользователь №: 15 388



Чистый С. gcc - WinAVR 20050214.

файл global.h:
Код
#ifndef GLOBAL_H
#define GLOBAL_H
...
U16 d_status; //слово текущего статуса
...
#endif //GLOBAL_H


файл check.с:
Код
#include "global.h"
...
Set_bit(d_status,num_bit);
...


файл ins.с:
Код
#include "global.h"
...
Clr_bit(d_status,num_bit);
...


файл outs.с:
Код
#include "global.h"
...
if (bit_is_set(d_status,num_bit)) {
...
};
...


Вот такой изврат... blush.gif
И ведь работает... Только грабли с непрозрачностью потоков данных - во весь рост. Но это уже другая тема.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 30 2010, 13:20
Сообщение #34


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Странно, что работает.
Грамотнее было бы U16 d_status; определить в файле global.c, а в файле global.h обьявить как extern U16 d_status;
И никакого изврата.
Go to the top of the page
 
+Quote Post
Juray
сообщение Sep 30 2010, 13:51
Сообщение #35


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-03-06
Из: Йошкар-Ола
Пользователь №: 15 388



Да вот сам удивляюсь, читая эту ветку.
Что грамотнее - знаю. Говорю же - быдлокод. Вам год версии WinAVR ничего не говорит? Это пять лет назад было - я не знал ни о extern, ни о progmem, только начинал кодить на C, до того на асме для 51-х писал, да на всяких дельфях и фокспро.

Сообщение отредактировал Juray - Sep 30 2010, 13:54
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 30 2010, 15:24
Сообщение #36


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

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



Цитата(Juray @ Sep 30 2010, 17:51) *
Вам год версии WinAVR ничего не говорит? Это пять лет назад было

Ты думаешь что в той версии было можно а сейчас нет? А поскольку сейчас той версии ни у кого нет, то придется верить на слово? Я в это не верю - если одна переменная будет объявлена в нескольких объектных файлах, то линкер не может не ругаться. Просто потому, что он не сможет эти переменные разместить. Может твой h-файл включался только в один C-файл и тогда это прокатывало.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 30 2010, 15:39
Сообщение #37


Гуру
******

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



Возможно та версия WinAVR не применяла раздельную компиляцию файлов. Тогда все понятно. На самом деле хедер был включен лишь один раз. Остальные два блокировались препроцессором (#ifndef GLOBAL_H ... #endif).
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 30 2010, 15:58
Сообщение #38


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

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



Цитата(rezident @ Sep 30 2010, 19:39) *
Возможно та версия WinAVR не применяла раздельную компиляцию файлов. Тогда все понятно. На самом деле хедер был включен лишь один раз. Остальные два блокировались препроцессором (#ifndef GLOBAL_H ... #endif).

То есть в C-файл включались не только хедеры, но и остальные C-файлы? Неужели WinAVR был таким примитивным? smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 30 2010, 16:03
Сообщение #39


Гуру
******

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



Цитата(777777 @ Sep 30 2010, 21:58) *
То есть в C-файл включались не только хедеры, но и остальные C-файлы? Неужели WinAVR был таким примитивным? smile.gif
Не знаю, я только предположение высказал laughing.gif
Go to the top of the page
 
+Quote Post
Juray
сообщение Oct 1 2010, 11:56
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-03-06
Из: Йошкар-Ола
Пользователь №: 15 388



Цитата(777777 @ Sep 30 2010, 19:24) *
Ты думаешь что в той версии было можно а сейчас нет?

А полностью абзац прочитать? Я имел в виду, что это было давно, и в таком стиле я уже не пишу.

Цитата(777777 @ Sep 30 2010, 19:24) *
А поскольку сейчас той версии ни у кого нет, то придется верить на слово? Я в это не верю

А я не верю, что ни у кого нет.
И можно проверить в более свежей версии.
Сейчас вот накидал тестовый проектик в 20090313 - работает, ни одного варнинга.

Прикладываю проект вместе с lst и map, а также скриншоты прогона в эмуляторе.
Прикрепленный файл  test.zip ( 5.25 килобайт ) Кол-во скачиваний: 105

Data: 1 bytes (0.1% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...


Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

Go to the top of the page
 
+Quote Post
777777
сообщение Oct 1 2010, 16:36
Сообщение #41


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

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



Цитата(Juray @ Oct 1 2010, 15:56) *
Сейчас вот накидал тестовый проектик в 20090313 - работает, ни одного варнинга.

Забавно. Те же файлы подсунутые в Visual Studio 2008 выдали ошибку:

1>module.obj : error LNK2005: "char global_var" (?global_var@@3DA) already defined in test.obj
1>C:\Users\SWW\Documents\Visual Studio 2008\Projects\test\Debug\test.exe : fatal error LNK1169: one or more multiply defined symbols found

И еще кто-то говорит о стандартах и переносимости... Интересно, а что скажет IAR, кто-нибудь проверит?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 2 2010, 08:29
Сообщение #42


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Juray @ Oct 1 2010, 15:56) *
Сейчас вот накидал тестовый проектик в 20090313 - работает, ни одного варнинга.

А предупреждения включены? Их вывод лучше в makefile задавать.
IMHO: лучше включить все, ну, кроме некоторых rolleyes.gif , чтобы потом не было грусно при отладке.



--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Juray
сообщение Oct 2 2010, 08:44
Сообщение #43


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-03-06
Из: Йошкар-Ола
Пользователь №: 15 388



Предупреждения - по умолчанию. Этого недостаточно?
И ведь дело не в предупреждениях - по прогону явно же видно, что отовсюду ссылка идет на одну и ту же переменную, да и memory usage при компиляции отчиталось - "1 bytes". (если сделать переменную static - получаем "Data: 2 bytes" ).

Интересно бы проверить в "большом" gcc.

Кстати, вот если в global.h вставить
Код
const char glob_const = 3;

- вываливается ошибка "multiple definition of `glob_const'". Соответственно "Build failed with 1 errors and 0 warnings..."

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 Текстовая версия Сейчас: 27th June 2025 - 13:30
Рейтинг@Mail.ru


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