Автор |
Съобщение |
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1954
|
Re: глобални променливи в С
Всяка е глобална ако не е static. В друг файл може да кажеш extern променлива; и да си я ползваш.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Нед Дек 29, 2019 8:06 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Леле много се изписа. Прочетох малко да static я прави видима или нещо като локална само за файла където се декларира. Реално са се получили 2 отделни променливи с еднакво име и затова не можело да я променям от другия .c файл Да може би не е добра практика да ги инициализирам във header-a, освен ако не са константи някакви. Има варианти да пиша extern по .c файловете, но е неудобно. Ако я напиша със extern във header-a пак не ще, ако я инициализирам дава същата грешка. Някъде четох че по подразбиране променливата била extern. Т.е. това е само декларация. Но ако и се зададе стойност става дефиниция дори и да има extern. Гледах и някакви гимнастики със #eleif писаници във header-а, ама много писане... На моите header-и съм сложил въпросните safe guard-ове. Но пак не може да се инициализират глобални променливи. Все пак реално като се замисля, да се зададе някаква стойност на променливата е изпълним код и принципно не е добре да се прави във header-а. Интересното беше, че това не е проблем във mplab-a XC8 там няма такива проблеми, и очаквах да е някаква настройка в GCC.
|
Нед Дек 29, 2019 8:37 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: глобални променливи в С
Е - тая инициализация на глобална променлива в хедър файл...като го включиш няколко пъти тоя хедър в няколко Ц файла....ще стане не спагети, ами боза. За мене е редно да не се компилира.. Стартъп кода ти ги нулира (ако е разрешен) , другото си е твоя грижа в началото на програмата - и по прегледно и по-безопасно. Броят на натиснатите клавиши ще е еднакъв. C::B има много голям екран опции за компилатора(MinGW? ) - кое е грешка, кое не е....ама май по-добре да не се пипа там.
|
Нед Дек 29, 2019 9:25 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Ами да разбирам не е добре да се инициализира там. Но ако е константа къде да я инициализирам ? Със const пак дава такива грешки. Пробвам константата само да я декларирам в хедъра а във цето да и задам стойност (дефинирам) ама не става. Имам тука един проект на XC8 в който съм написъл едни константи в хедъра и се ползват от целият проект. Всъщност са едни дълги стрингове от по 100 и повече символа. Единствения начин да не гърми GCC е да ги пиша константите във всеки .c файл, което е упражнение за луди.
Последна промяна slav4o.com на Нед Дек 29, 2019 9:56 pm, променена общо 1 път
|
Нед Дек 29, 2019 9:53 pm |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1954
|
Re: глобални променливи в С
Дай някакъв пример. Бобът е на свършване.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Нед Дек 29, 2019 9:55 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Ами примерно : main.h : main.c : lib.h : lib.c :
|
Нед Дек 29, 2019 9:59 pm |
|
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 5:52 pm Мнения: 10356 Местоположение: Добрич
|
Re: глобални променливи в С
|
Нед Дек 29, 2019 10:09 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: глобални променливи в С
Ами и константите могат да се декларират extern, a ако са някакви прости числа - може и с #define MAXALABALA 120 .
Всъщност тук имаш #include "lib.h", да не би тоя хедър да е добавен и като файл към проекта?
|
Нед Дек 29, 2019 10:10 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Миро, да така работи Оказва се че в хедъра може и без extern, явно са наистина по дефолт екстерн. Стефан, да в графата Headers не е във Sources където са .c -тата
|
Нед Дек 29, 2019 10:14 pm |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1954
|
Re: глобални променливи в С
Сложи const int testconst2 = 2; в *.c файл. Направи съответен *.h файл със следното extern int testconst2;
По-горе писах: extern int testconst2; не заема памет - само казва на компилатора, че има такава променлива с даден тип. const int testconst2 казва на компилатора да задели sizeof(int) байта памет. Ако това нещо го има на повече от едно място тогава, виждаш грешката, за която питаш - поне е кристално ясна - за всеки отделен *.c файл, в който добавиш твоя заглавен lib.h компилатора ще задели sizeof(int) байта, но линкера ще се чуди какво да ги прави понеже са с еднакви имена.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Нед Дек 29, 2019 10:17 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Мда така със extern си се получава. Във XC8 обаче ако не напиша в хедъра extern ми казва От друга страна мога да изстрия да не пише нищо във lib.c а константата да си я напиша във lib.h cosnt int testconst2 = 2; и да си я ползвам в целият проект, без изобщо да имам lib.c Демек нещо като header само с константи Номера обаче не става в GCC Това с #define не винаги ще върши работа, ако имам съобщение стринг с интервали няма как да го въведа...
|
Нед Дек 29, 2019 10:31 pm |
|
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 1:01 pm Мнения: 1952 Местоположение: Варна
|
Re: глобални променливи в С
Ей... Евала, Аферим, Ашколсун... Добре е да знаеш още, че XC8 е порт на GCC
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
Нед Дек 29, 2019 11:56 pm |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Добре сега още един новобрански въпрос Начи имам си #include <stdio.h> и след това мога да си пиша printf("Ala Bala"); // printf e функция от stdio.h напраайвам си библиотека lib.c и тя си има lib.h във lib.c си имам TestFunc(); във main.c си я инклудвам и нея #include lib.h Опитвам се да извикам TestFunc(); но линкера дава грешка, ако не съм добавил в проекта lib.c Да разбираемо, донякъде. Хубаво ама защо не ме кара да добавям в проекта stdio.c и си ги намира функциите ? Как да го направя тоя чалъм и с моята библиотека ?
|
Пон Дек 30, 2019 12:35 am |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: глобални променливи в С
Както Миро каза - нито риба, нито рак. И без "extern" променливата реално само се декларира (и в двата Ц файла), накрая линкера я дефинира според декларацията и двата сорса работят с една и съща променлива.Поне така ми изглежда. Ако има инициализация и в двата файла - гърми. Това с C::B ,компилатор MinGW-g++ . Оттук и защо гърми , ако е инициализирана в хедър, който се включва в няколко сорса. XC8 е малко по-друга бира..."embedded" бира, та силно ми се струва, че конструкция "const int XX=8;" се свежда по-скоро до "#define XX 8" и въобще не се заделя памет за XX.
Има си някакви прекомпилирани библиотеки, които реализират функциите , описани в stdio.h. Линкера си ги търси сам. Твоето lib.c можеш да го компилираш до библиотека lib.a и после да посочиш на линкера да търси функции и в тази библиотека.
|
Пон Дек 30, 2019 12:56 am |
|
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 7:04 pm Мнения: 2581 Местоположение: Велико Търново / София
|
Re: глобални променливи в С
Сега ми дойде на ум, ако я прекомпилирам библиотеката, дали ще ми се намали цялото време на компилиране ? Но ще са утре пробите, че стана късно...
|
Пон Дек 30, 2019 1:24 am |
|
|