
Re: XC8 достъп до статична променлива
Абе не се карайте на детето, обяснето му

Стефчо, при Ц-то освен ако не пишеш нещо от сорта "hellow world" сорс кода рядко се събира в един единствен файл. То не че не можеш да наблъскаш всичко в един файл, ама може да стане голяма боза... Хубаво е да си групираш сорса в отделни файлчета по някаква прегледна логика.
Сега, номерът е че ако имаш повече файлчета, компилацията им е независима. Т.е. всеки си се компилира сам за себе си, независимо от останалите. Така всеки сорс файл се компилира до обектен файл. После има един процес нарече линкване, при който от обектните файлове се сглобява изпълним файл/hex/bin/elf или каквото там му кажеш.
Но да се върнем на сорса.... казахме, че той се компилира файл по файл, независимо един от друг. Какво става обаче ако код от един сорс файл ползва код или данни от друг сорс файл. Някак си компилаторът трябва да може да се ориентира дали кода/данните са локални или не. За целта се гледат няколко неща.
Първо имаш декларация и дефиниция. Декларациите са като обещанията... казваш на компилатора, че някъде ще има такова животно, ама къде ще е, не е ясно. Докато дефиницията буквално заковава това дето дефинираш на мястото дето го дефинираш. Демек един вид създаваш го това нещо.
Примерно:
Казахме, че говорим за много сорс файлове... За да може да ползваш в един сорс код/данни от друг ти трябват само декларациите. За удобство декларациите се пишат в h-файлове, докато дефинициите по принцип са в сорсовете. Не че е задължително, просто такава е практиката. Защо, ами защотото дефиницията ако се замисилиш малко ще се сетиш че трябва да е една. А пък декларациите трябва да ги имаш толкова пъти, колкото пъти ги ползваш в различни сорс файлове. Да ама тъпо да правиш copy&paste... много по-удобно е просто да вмъкнеш с #include декларациите на това дето ще ползваш.
Ако сложиш дефиниция в хедър и тоя хедърър го инклуднеш на 5 места все едно правиш 5 различни дефиниции. Ако това са променливи значи правиш 5 различни променливи. Дефакто ти може точно това да си искал, макар че често се случва и по погрешка. Затова повечето компилатори предупреждават, освен ако не сложиш "static" което значи че искаш storage class-а да е локален, демек казаш на компилатора че не си се объркал и искаш да работиш с локално дефинирана финкция/променлива. Дори и да има някъде другаде същата дефиниция със същото име не е проблем, ти си казал че работиш с локалната.
"volatile" пък означава, че въпросната променлива може да не е просто променлива, а хардуерен регистър или просто искаш да кажеш че операциите с това животно са важни (за теб) и компилаторът не трябва нито да ги оптимизира (маха) нито да ги разбърква във времето с други подобни.
Примерно ако имаш някакъв израз, обаче резултата не се използва, то компилатора може да реши да го "оптимизира". Ако обаче в израза имаш volatile, то те ще се четат независимо дали прочетеното после се ползва или не.