Newsgroup: it.comp.os.linux.development
Titolo: overload, in C

Poco tempo fa' mi sono scontrato con il concetto di overloading di una
funzione, cioe' la possibilita' di passare parametri di tipo diverso usando
una funzione sola. Cercando qua e la' sembra che questa tecnica sia
sfruttabile solo in C++ et similia, ma la mia perplessita' rimane: sicuri
sicuri che in C non si possa fare?
Ho dunque intercettato l'esistenza delle va_list, le strutture utilizzate in
funzioni che, dal basso della mia ignoranza, possono essere considerate
"overloadate": un esempio puo' essere printf, cui si passa una stringa e una
serie di parametri di natura diversa ("%s = %d\n", "Quindici", 15 ).
Puo' essere questa caratteristica in C assimilabile alla disponibilita' di
overloading in C++?
Se no, perche'?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 overloading in C++?
da quello che ho letto C++ implementa l'overloading delle funzioni di
fatto creando durante la compilazione un arrai di puntatori a funzione e
la selezione della funzione richiesta vene effettuata a runtime guardando
quali sono i parametri passati alla funzione stessa. E questa cosa non
esiste nel C.

 esiste nel C.
sicuro che non sia l'overriding questo? afaik l'overloading delle 
funzioni non viene risolto assolutamente a runtime.
-- 
There are better things in life than alcohol, but alcohol makes up for 
not having them. - Terry Pratchett.

 funzioni non viene risolto assolutamente a runtime.
l'ho letto tanto tempo fa e non mi occupo di sviluppare compilatori c++,
quindi può darsi che faccia confusione con la gestione degli oggetti.
Comunque, cercando su google sono arrivato qua:
http://www.openroad.org/school/faq/cpp1.html#NameMangle
In effetti alla fine dice che è un errore a livello di linker. 
Comunque, quello che volevo dire è che mentre in C++ questa selezione
delle funzioni avviene in modo trasparente all'utente, mentre la soluzione
proposta da Roberto non lo è.

 quindi può darsi che faccia confusione con la gestione degli oggetti.
Confermo, il polimorfismo viene gestito a runtime, l'overload delle 
funzioni e` compiletime. In pratica i nomi delle funzioni in C++ sono 
composte dalla label che ci da il programmatore piu` una serie di 
caratteri aggiuntivi che ne identificano i parametri (NameMangle). Di 
conseguenza il linker fallisce se si chiama una funzione con i parametri 
sbagliati (ammesso che ne sia stato definito il prototipo, altrimenti 
non compila proprio).
L'estensione ... e' diversa in quanto indica semplicemente che la 
funzione ha un numero variabile di parametri messi sullo stack, ma il 
sistema non fornisce alcun metodo per capire QUANTI parametri 
effettivamente ci sono. La famiglia di printf se la cava contando i 
campi variabili nella stringa di formato, in altri casi e' necessario 
mettere un parametro NULL alla fine o mettere prima dei parametri 
variabili un parametro che specifichi il numero di parametri variabili.
In ogni caso non e` in alcun modo assimilabile all'overload dei nomi che 
si puo` fare in C++.
Bye,
  Gbary

 overloading in C++?
Prima di tutto l'overloading in C++ viene gestito a compile time, con
tutto il type-checking statico. Le funzioni con parametri variabili del
C, invece, non forniscono alcuna informazione sul tipo e sul numero
degli elementi passati.
Ad esempio la printf utilizza una stringa di formato per stabilire
quanti parametri sono stati passati; infatti passare una stringa di
formattazione errata i risultati sono imprevedibili.
Potresti usare un parametro per indicare quanti argomenti verranno
passati, oppure terminare la lista con un valore particolare, pero` ti
affidi sempre al chiamante affinche` ti passi qualcosa di sensato.
Luca
-- 
Home: 
http://kronoz.cjb.net
It can't rain forever,
but you can die before seeing the sun again.