2012-01-07 9 views
21

Stavo leggendo l'articolo di Wikipedia sul C11, la nuova versione dello standard C rilasciato nel dicembre 2011, e ho visto che una delle caratteristiche aggiunte era "espressioni di tipo generico":Espressioni di tipo C11: perché non aggiungere semplicemente l'overloading di funzione?

Type-generic espressioni usando la parola chiave _Generic. Ad esempio, il seguente macro cbrt (x) traduce cbrtl (x), cbrt (x) o cbrtf (x) a seconda del tipo di x:

#define cbrt(X) _Generic((X), long double: cbrtl, \ 
           default: cbrt, \ 
           float: cbrtf)(X) 

Questo mi sembra abbastanza orribile - se cambieranno comunque il linguaggio, perché non aggiungere semplicemente l'overloading di funzioni come in C++?

+13

Probabilmente perché ciò richiederebbe un manomissione del nome e _Generic può essere risolto completamente in fase di compilazione. Ad ogni modo, se sei serio riguardo alla programmazione generica non dovresti guardare a C. –

+4

l'overloading della funzione probabilmente incorre in un enorme problema di compatibilità all'indietro in quasi tutte le implementazioni (pensa a come i runtime/linker/caricatori trattano i simboli) – nos

+3

@CatPlusPlus: Il sovraccarico per le funzioni dichiarate "in linea" avrebbe fornito il 99% del vantaggio derivante dall'overloading generale delle funzioni, senza problemi di manomissione del nome. Anche se si desidera essere in grado di chiamare una funzione sovraccaricata da altri moduli, si potrebbe semplicemente includere all'interno del file di intestazione funzioni "inline" sovraccariche che chiamerebbero quindi funzioni con nomi diversi per diversi tipi di parametri. I nomi delle funzioni sarebbero specificati nel file di intestazione, quindi non sarebbe richiesto alcun manichino specifico del compilatore. Ci sarebbe stato qualche problema con quello? – supercat

risposta

26

C ha uno spazio dei nomi per simboli esterni e applica l'ODR (One Definition Rule) in modo che due oggetti extern con lo stesso nome in due unità di traduzione debbano avere la stessa definizione.

Sebbene sia possibile creare un ABI C che supporti l'overloading, la forza principale di C è la sua semplicità ABI. Su quasi tutte le piattaforme "l'ABI è C ABI e svolge un ruolo nell'esecuzione indipendentemente dalla lingua di partenza. Questo andrebbe perso se i simboli dovessero includere informazioni sul tipo.

TGE (come utilizzato dalla libreria) è solo una versione manuale di manomissione del nome. Fa (o farà, a volte in un futuro forse molto lontano) il lavoro che deve fare, per consentire le dichiarazioni typedef per controllare la generazione di loop interni ad alta intensità di matematica. Le persone che hanno bisogno delle funzionalità di un linguaggio come il C++ dovrebbero portarsi su C++.

Problemi correlati