Close

Odpověď na: Linux x Windows rozdíly v kompilaci?

Úvodní stránka Fórum Hardware Arduino Linux x Windows rozdíly v kompilaci? Odpověď na: Linux x Windows rozdíly v kompilaci?

#10476
Zbyšek Voda
Správce

Dobrý den, mě ta otázka přijde položená docela jasně 🙂

Pouštím se teď na trochu tenký led, tak snad neplácnu nějakou blbost.

Podle mě jde o to, že norma C++ nevynucuje návrat hodnoty z funkce pomocí return (i když tato funkce není void).Potom tedy závisí na kompilátoru, jak si s tím poradí. Použitý kompilátor pro Arduino je avr-gcc, který se ale asi na obou platformách chová trochu odlišně (právě v takovýchto normou nedefinovaných případech).

Podle mě může dojít ke dvěma možnostem:
1) Na linuxu je defaultní hodnota z funkcí bez return nulová, na Windows nenulová.
Tato možnost ale asi není moc pravděpodobná.

2) V https://gcc.gnu.org/wiki/avr-gcc píší, že jednobytové hodnoty se vrací pomocí registrů (ATmega v Arduinech je většinou 8-bitová, takže má i 8-bit registry). Boolean je jenom jiné pojmenování pro bezznaménkové osmibitové číslo, takže se asi vrací v registrech. A právě registry v tom podle mě dělají ten rozdíl – na linuxu se kompilátor chová tak, že registr použitý k návratu vynuluje, kdežto na Windows ne. Díky tomu v registru zůstane hodnota, která už tam byla před voláním funkce (a s největší pravděpodobností je nenulová), takže pak dostanete odpověď OK.

Aspoň takto si to vysvětluji.

Použití if (Testfunction()) je v pořádku. Můžete si představit, že kompilátor toto vidí jako if (Testfunction() != 0).