Voor het schrijven van programma'tje voor de Atmel processor gebruik ik tegenwoordig Visual Studio Code, met PlatformIO in de "Arduino stand".

[env:ATmega328P]
platform = atmelavr
board = ATmega328P
framework = arduino

Als ik nu in de algemene loop() functie een variabele declareer die ik verder nooit gebruik krijg ik netjes een "Unused variable" warning, handig als er nog wat test rommel stond die niet opgeruimd is.

Echter, wanneer ik die variabele globaal declareer buiten setup() en loop() , in het begin van het programma krijg ik die melding niet.
Kan iemand mij dat uitleggen ?
Had er nu gestaan : int unusedvariable = 0; had ik het nog begrepen omdat hij dan toch wel gebruikt word.

Hoe zou die compiler moeten weten dat je die variabele nooit gebruikt?

Van een globale variable kan de compiler, die elke file apart compileert, niet weten of hij nog ergens anders gebruikt wordt. De linker, die alle object files bij elkaar veegt, zou dat kunnen weten, en als de optimalisaties aan staan zal hij hem ook weg laten, maar daar krijg je geen warning van.

Als je in de .map file kijkt zul je hem daar niet vinden, als de optimalisaties aan staan dus.

Misschien afhankelijk van het optimization level, GCC kent gruwelijk veel optimization flags.

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Inderdaad.

Een globale variabele kan gebruikt worden in een andere compile unit (source file), dus de compiler kan niet weten of dat al-dan-niet gebeurt. De compiler werkt maar met 1 sourcefile tegelijk.

En de linker geeft ook geen melding want de meeste libraries zitten vol met zaken die niet altijd gebruikt worden.

Een lokale variabele kan alleen lokaal gebruikt worden. Als dat dan niet gebeurt dan kan hij nergens gebruikt worden. Dus daar kun je wel een warning voor geven.

Op dinsdag 24 februari 2026 17:14:02 schreef deKees:
Inderdaad.

Een globale variabele kan gebruikt worden in een andere compile unit (source file), dus de compiler kan niet weten of dat al-dan-niet gebeurt. De compiler werkt maar met 1 sourcefile tegelijk.

En de linker geeft ook geen melding want de meeste libraries zitten vol met zaken die niet altijd gebruikt worden.

Een lokale variabele kan alleen lokaal gebruikt worden. Als dat dan niet gebeurt dan kan hij nergens gebruikt worden. Dus daar kun je wel een warning voor geven.

Helemaal duidelijk, dank u.

Op dinsdag 24 februari 2026 16:51:15 schreef bprosman:
in het begin van het programma krijg ik die melding niet.
Kan iemand mij dat uitleggen ?

Een compiler compileert bestand-voor-bestand en link daarna al die dingen aan mekaar. Een ander bestand KAN die variabele van jou nog gebruiken, dat weet ie niet als ie jou bestandje aan het compileren is.

Dat wordt anders als je er "static" voor zet. Dan beschermt hij die variabele tegen gebruik in andere bestanden. Dus als jij een "stepper.c" hebt die een
"static int initialized=0;" heeft, en precies hetzelfde in "lcd.c", dan zijn dat TWEE verschillende variabelen. En ook nog: als je hem nooit gebruikt in het huidige bestand dan kan ie waarschuwen dat je een ongebruikte variabele hebt!

Toch zit je wel in een grijs gebied.

Als je zo een variabele in een andere compile unit zou gebruiken, dan is er normaal gesproken ook een declaratie in een header file, en die header zou dan normaal ook in deze compile unit ge-include worden. Maar dat is niet verplicht. Een extern declaratie in die andere file is voldoende.

Maar dan nog, waarom zou je de variabele in een andere file aanmaken dan waar je hem gebruikt. Dat is dan wel tamelijk vreemde manier van werken.

Soms is dat handig (maar wellicht wat smerig...) voor settings ofzo.
Zeker in de tijd dat het nog plain C was...
Verder zijn 'globals' niet voor niks 'global'. Nooit echt noodzakelijk. Soms wel handig.

Die "Static" helpt me wel en doet eigenlijk wat ik hoopte.
zitten er nog nadelen aan om alle global variabelen als "Static" te declareren ?
(Behalve bestaande libraries zet ik functies nooit in losse bestanden eigenlijk dus alles zit in main.cpp).

Nadelen: meer tekst, meer typewerk.

Maar verder vooral voordelen. Wat mij betreft zou dat de default moeten zijn, maar helaas.

Maar natuurlijk alleen voor dingen die je niet ook in andere source files wilt gebruiken, want dat kan dan niet meer..

En je moet opletten met locale variabelen. Die kun je ook static maken, maar dat heeft dan een heel andere betekenis.

[Bericht gewijzigd door deKees op (19%)]

Tsja... nadelen... Het is niet voor niks een global. Nu is het het eigenlijk van beide kanten net niet. Het is geen global, het is geen local. Een beetje een onhandige tussenvorm zeg maar...
Maar als het je helpt, dan zal het wel.

Op dinsdag 24 februari 2026 20:18:44 schreef bprosman:
Die "Static" helpt me wel en doet eigenlijk wat ik hoopte.
zitten er nog nadelen aan om alle global variabelen als "Static" te declareren ?

Nee, niet echt.

D'r is nog een tweede ding. Als je een functie een tweede keer aanroept, dan zijn alle variabelen weer ongedefinieerd aan het begin van die functie. Als je iets wil onthouden tussen twee aanroepen, moet je een globale variabele gebruiken.... Totdat je uitvind wat static doet.


int somefunc (int somearg)
{
  static int count;
  count++;
  printf ("Somefunc aanroep %d: arg is %d\n", count, somearg);
}

De count variabele is alleen zichtbaar binnen de functie maar blijft bewaard tussen aanroepen!