Lua 5.1 annulla ufficialmente l'uso della tabella arg
per vararg, preferendo ...
. Tuttavia, vi è un'opzione di compilazione per Lua stessa, LUA_COMPAT_VARARG
, per consentire l'uso di arg
in codice 5.1.
Se LUA_COMPAT_VARARG
stata definita quando Lua è stato compilato, una tabella arg
verrà creato in funzioni varargs, e popolato con gli argomenti - a meno che il compilatore rileva l'uso ...
all'interno della funzione. In tal caso, si presuppone che si stiano utilizzando varargs stile 5.1 invece di 5.0 e non si crei la tabella. Lo fa, tuttavia, crea ancora il locale chiamato arg
!
Il risultato di questo è che se LUA_COMPAT_VARARG
è definito, funzioni vararg che non utilizzano ...
nel corpo ottenere un local arg
contenente la lista degli argomenti, e le funzioni di vararg che fanno ottenere un local arg
contenente nil
. Questo bug è presente in tutte le versioni di 5.1 e significa, in particolare, che non è possibile accedere a un valore globale o superiore denominato arg
da qualsiasi funzione varargs se LUA_COMPAT_VARARG
è stato definito in fase di compilazione.
Lua 5.2 gocce di supporto per varials stile arg
completamente e quindi non ha questo problema indipendentemente da come è stato configurato in fase di compilazione.
(Fonte: le variazioni di movimentazione tra 5.0 e 5.1, e l'opzione LUA_COMPAT_VARARG
varargs, sono menzionati in the Lua 5.1 reference manual, section 7.1 Il manuale si riferisce a luaconf.h Il comportamento esatto non è documentato da nessuna parte, per quanto ne sono a conoscenza.. ; può essere determinato sperimentalmente, leggendo lparser.c e ldo.c o dai post sulla mailing list che originariamente riportava questo problema)
Ok, è interessante. L'ho provato con lua 5.2.0 e ho ottenuto questo: 'table: 00899618' come valore di' args' (conferma quello che hai detto). Con "tempo di compilazione", intendi quando compili l'interprete di lua o quando compili uno script di lua usando "luac.exe". Come si arriva a conoscere tali dettagli? – Segfault
@Segfault indica quando l'interprete è compilato dall'origine e qualcosa come '-DLUA_COMPAT_VARARG' viene fornito al compilatore C. ecc. – greatwolf
' -DLUA_COMPAT_ALL' si trova nel makefile. Immagino che '_ALL' significhi che' LUA_COMPAT_VARARG' sia incluso. Questa informazione è presente nella documentazione o qualcosa del genere? – Segfault