Creiamo una libreria in C

Succede una cosa strana, almeno a me sembra strana.

Ho una variabile static prescaler inizializzata in un file header, questa variabile dobrebbe essere visibile solo nel file in cui è dichiarata però una macro usata nel main aggiorna questa variabile. Vi faccio vedere il file main.cpp che ha subito il lavoro del preprocessore cpp.

// main.cpp
int main() {
    gpio_mode(&(*(volatile uint8_t *)((0x04) + 0x20)), &(*(volatile uint8_t *)((0x05) + 0x20)), &(*(volatile uint8_t *)((0x03) + 0x20)), 0, 0);
    gpio_on(&(*(volatile uint8_t *)((0x04) + 0x20)), &(*(volatile uint8_t *)((0x05) + 0x20)), &(*(volatile uint8_t *)((0x03) + 0x20)), 0, 0);
    volatile uint8_t *out_b0 = &(*(volatile uint8_t *)((0x05) + 0x20));
    *out_b0 &= ~(1 << (0));
    __prescaler__ = 0x4;;
    (*(volatile uint8_t *)(0x81)) = ((*(volatile uint8_t *)(0x81)) & 0xf8) | __prescaler__;;
    (*(volatile uint8_t *)(0x81)) = ((*(volatile uint8_t *)(0x81)) & 0xf8) | 0x0;;

while(1); }

come si vede la variabile dichiarata static in un header file non incluso direttamente viene aggiornata nel main dove questa variabile non dovrebbe essere visibile e quindi dovrebbe andare in errore la compilazione, invece non solo non va in errore ma anche il main.s risulta corretto

/* main.s */
	.file	"main.cpp"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__CCP__ = 0x34
__tmp_reg__ = 0
__zero_reg__ = 1
	.text
.global	main
	.type	main, @function
main:
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
	sbi 36-32,0
	sbi 37-32,0
	cbi 37-32,0
	ldi r24,lo8(4)
	sts _ZL13__prescaler__,r24
	lds r24,129
	andi r24,lo8(-8)
	ori r24,lo8(4)
	sts 129,r24
	lds r24,129
	andi r24,lo8(-8)
	sts 129,r24
.L2:
	rjmp .L2
	.size	main, .-main
	.lcomm _ZL13__prescaler__,1
.global __do_clear_bss

Che dite è normale o no, comunque a me torna comodo davvero sta cosa ma se è un errore del compilatore poi non funzionerà più.

Ciao.

mmm... non capivo cosa fa .lcomm ZL13__prescaler_,1 e allora l'ho cercato e a quanto sembra è questo che risolve il mancato riferimento ad una
variabile statica locale, quindi GCC capisce che voglio aggiornare il valore di questa variabile nel main ed usa questo espediente, però non sono sicuro e cerco conferma.