c namespaces ansi-c

¿Por qué ANSI C no tiene espacios de nombres?



namespaces ansi-c (8)

ANSI C se inventó antes que los espacios de nombres.

Tener espacios de nombres parece obvio para la mayoría de los idiomas. Pero hasta donde puedo decir, ANSI C no lo admite. Por qué no? ¿Algún plan para incluirlo en un futuro estándar?


C tiene espacios de nombres. La sintaxis es namespace_name . Incluso puede general_specific_name como en general_specific_name . Y si desea poder acceder a los nombres sin escribir el nombre del espacio de nombres en todo momento, incluya las macros de preprocesador relevantes en un archivo de encabezado, por ejemplo

#define myfunction mylib_myfunction

Esto es mucho más limpio que el nombre de manipulación y las otras atrocidades ciertos lenguajes se comprometen a entregar espacios de nombres.


C tiene espacios de nombres. Uno para las etiquetas de estructura y otro para otros tipos. Considere la siguiente definición:

struct foo { int a; }; typedef struct bar { int a; } foo;

El primero tiene etiqueta foo, y el último se convierte en tipo foo con un typedef. Todavía no hay un enfrentamiento de nombres. Esto se debe a que las etiquetas y los tipos de estructura (tipos incorporados y tipos definidos por tipos) viven en espacios de nombres separados.

Lo que C no permite es crear un nuevo espacio de nombres por voluntad. C se estandarizó antes de que esto se considerara importante en un idioma, y ​​la adición de espacios de nombres también amenazaría la compatibilidad con versiones anteriores, ya que requiere el cambio de nombre para funcionar correctamente. Creo que esto se puede atribuir debido a tecnicismos, no a la filosofía.

EDITAR: JeremyP afortunadamente me corrigió y mencionó los espacios de nombres que me perdí. También hay espacios de nombres para las etiquetas y para los miembros de struct / union.


Históricamente, los compiladores C no destruyen los nombres (lo hacen en Windows, pero el cambio para la convención de llamadas cdecl consiste en solo agregar un prefijo de subrayado).

Esto facilita el uso de librerías C de otros lenguajes (incluido el ensamblador) y es una de las razones por las que a menudo se ven contenedores extern "C" para API de C ++.


No es una respuesta, pero no es un comentario. C no proporciona una forma de definir el namespace explícitamente. Tiene un alcance variable. Por ejemplo:

int i=10; struct ex { int i; } void foo() { int i=0; } void bar() { int i=5; foo(); printf("my i=%d/n", i); } void foobar() { foo(); bar(); printf("my i=%d/n", i); }

Puede usar nombres calificados para variables y funciones:

mylib.h void mylib_init(); void mylib_sayhello();

La única diferencia con los espacios de nombres es que no puede using y no puede importar from mylib .


Para completar, hay varias formas de lograr los "beneficios" que puede obtener de los espacios de nombres, en C.

Uno de mis métodos preferidos es usar una estructura para albergar un conjunto de punteros de método que son la interfaz de su biblioteca / etc.

A continuación, utiliza una instancia externa de esta estructura que inicializa dentro de su biblioteca apuntando a todas sus funciones. Esto le permite mantener sus nombres simples en su biblioteca sin pisar el espacio de nombres de los clientes (que no sea la variable externa en el alcance global, 1 variable vs posiblemente cientos de métodos ...)

Hay un poco de mantenimiento adicional involucrado, pero creo que es mínimo.

Aquí hay un ejemplo:

/* interface.h */ struct library { const int some_value; void (*function1)(void); void (*method2)(int); /* ... */ }; extern const struct library Library; /* interface.h */ /* interface.c */ #include "interface.h" void method1(void) { ... } void method2(int arg) { ... } const struct library Library = { .method1 = method1, .method2 = method2, .some_value = 36 }; /* end interface.c */ /* client code */ #include "interface.h" int main(void) { Library.method1(); Library.method2(5); printf("%d/n", Library.some_value); return 0; } /* end */

El uso de . la sintaxis crea una fuerte asociación con el método clásico Library_function () Library_some_value. Sin embargo, existen algunas limitaciones, para uno no se pueden usar macros como funciones.


Porque las personas que desean agregar esta capacidad a C no se han reunido y organizado para ejercer presión sobre los equipos de autor del compilador y sobre los organismos ISO.


solo razones históricas. nadie pensó en tener algo así como un espacio de nombres en ese momento. También estaban tratando de mantener el lenguaje simple. Pueden tenerlo en el futuro