2012-01-07 14 views
21

Estaba leyendo el artículo de Wikipedia sobre C11, la nueva versión de la norma C lanzado en diciembre de 2011, y vi que una de las características añadidas era "expresiones de tipo genérico":C11 tipo de expresiones genéricas: ¿por qué no agregar la función de sobrecarga?

de tipo genérico expresiones que utilizan la palabra clave _Generic. Por ejemplo, el siguiente macro cbrt (x) traduce en cbrtl (x), cbrt (x) o cbrtf (x) dependiendo del tipo de x:

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

Esto me parece bastante horrible: si van a cambiar el idioma de todos modos, ¿por qué no agregar la sobrecarga de funciones como en C++?

+13

Probablemente porque eso requeriría el cambio de nombre, y _Generic se puede resolver completamente en tiempo de compilación. De todos modos, si te tomas en serio la programación genérica, no deberías mirar C. –

+4

la sobrecarga de funciones probablemente incurriría en un enorme problema de compatibilidad con versiones anteriores en prácticamente todas las implementaciones (piensa cómo C runtimes/linkers/loaders tratan los símbolos) – nos

+3

@CatPlusPlus: Permitir la sobrecarga de las funciones declaradas "en línea" habría proporcionado el 99% del beneficio de la sobrecarga de funciones generales, sin problemas de manipulación de nombres. Incluso si uno quisiera poder llamar a una función sobrecargada desde otros módulos, uno podría simplemente incluir dentro del archivo de encabezado funciones "en línea" sobrecargadas que luego llamarían a funciones con nombres diferentes para diferentes tipos de parámetros. Los nombres de las funciones se especificarían en el archivo de encabezado, por lo que no se requeriría ningún cambio específico del compilador. Hubo algún problema con eso? – supercat

Respuesta

26

C tiene un espacio de nombre para símbolos externos y aplica la ODR (regla de una definición) de modo que dos objetos extern con el mismo nombre en dos unidades de traducción deben tener la misma definición.

Aunque es posible crear un C ABI que admita la sobrecarga, la principal fortaleza de C es su simplicidad ABI. En casi todas las plataformas, "el" ABI es el C ABI, y juega algún papel en la ejecución sin importar el idioma de origen. Esto se perdería si los símbolos tuvieran que incluir información de tipo.

TGE (según lo utilizado por la biblioteca) es simplemente una versión de manipulación manual del nombre. Hace (o lo hará, en algún momento en el futuro posiblemente muy lejano) el trabajo que necesita hacer, para permitir declaraciones typedef para controlar la generación de bucles internos de uso intensivo de matemática. Las personas que necesitan las características de un lenguaje como C++ deben ingresar a C++.

Cuestiones relacionadas