traducir traduccion teoria taber segun peter nord nida newmark ingles español definicion christiane autores c struct one-definition-rule

teoria - traduccion definicion



¿Se les permite a las diferentes unidades de traducción definir estructuras con el mismo nombre? (3)

Supongamos que tengo ac y bc , que definen tipos llamados struct foo , con diferentes definiciones:

#include <stdio.h> struct foo { int a; }; int a_func(void) { struct foo f; f.a = 4; printf("%d/n", f.a); return f.a * 3; }

#include <stdio.h> struct foo { // same name, different members char *p1; char *p2; }; void b_func(void) { struct foo f; f.p1 = "hello"; f.p2 = "world"; printf("%s %s/n", f.p1, f.p2); }

En C, ¿pueden estos archivos estar vinculados entre sí como parte de un programa conforme a las normas?

(En C ++, creo que esto está prohibido por la Regla de una sola definición).


En el lenguaje de programación C, no importa lo que usted llame sus tipos. Los símbolos se escriben de acuerdo con la estructura del tipo, no de acuerdo con los nombres de los tipos. Es completamente legal usar el mismo nombre de estructura para diferentes tipos de estructura en diferentes archivos. Sin embargo, no puede usar diferentes tipos para declarar la misma función.


La forma de pensar sobre esto es en términos de compilation units de compilation units . Un archivo .c , junto con una jerarquía anidada de archivos .h incluidos, comprende una única compilation unit . El preprocesador expande todos los archivos .h y presenta toda la compilation unit al compilador.

Una compilation unit es un espacio de nombre cerrado para macros, nombres de tipos, identificadores estáticos, enumeraciones, etc. Estos nombres no pueden tener duplicados dentro de este espacio de nombres, y ninguno de estos nombres está visible fuera de este espacio de nombres. La implicación es que una compilation unit diferente es un espacio de nombres separado y cerrado, y puede reutilizar los mismos identificadores, siempre que no haya duplicados dentro de ese espacio de nombres.

Por lo tanto, puede usar el mismo nombre para ciertos identificadores, siempre que se encuentren en espacios de nombres separados de la compilation unit .

Tenga en cuenta que los identificadores externos visibles, como variables globales no estáticas, funciones, etc. deben ser únicos en todo el espacio de nombres externo , que abarca todas las compilation units vinculadas entre sí en un único ejecutable.


Las etiquetas Struct son identificadores sin enlace (C11 6.2.2 / 6)

Las reglas sobre definiciones múltiples de identificadores sin vinculación se encuentran en 6.7 / 3:

Si un identificador no tiene vinculación, no habrá más de una declaración del identificador (en un declarador o especificador de tipo) con el mismo alcance y en el mismo espacio de nombre, excepto que:

  • un nombre typedef puede ser redefinido para denotar el mismo tipo que lo hace actualmente, siempre que ese tipo no sea de tipo variable modificado;
  • las etiquetas se pueden volver a declarar como se especifica en 6.7.2.3.

En su programa, las dos declaraciones de foo están en diferentes ámbitos, por lo que la condición "con el mismo alcance" no se cumple y, por lo tanto, esta regla no se infringe.