¿Cuál es la diferencia entre el indefinido, sin especificar, y la implementación de comportamiento definido en C y C++?

Yo estaba bastante seguro de que hemos dne esto antes, pero no puedo encontrarlo. Véase también: stackoverflow.com/questions/2301372/…
A partir de la comp.lang.c FAQ: la Gente parece hacer un punto de distinguir entre la aplicación definida, sin especificar, y un comportamiento indefinido. ¿Qué quiere decir?
Las marcas de moderador de la atención. (meta.stackexchange.com/questions/69504/…)
Cómo acerca de ser constructivo en lugar y enlace a la norma (si usted sólo quiere ayudar)?
theunixshell.blogspot.com/2013/07/…

OriginalEl autor Zolomon | 2010-03-07

9 Comentarios

  1. 341

    Un comportamiento indefinido es uno de los aspectos de la C y C++ lenguaje que puede ser sorprendente para los programadores que vienen de otros idiomas (otros idiomas tratar de ocultarlo mejor). Básicamente, es posible escribir programas de C++ que no se comportan de una manera predecible, a pesar de que muchos compiladores de C++ no se informe de cualquier error en el programa!

    Veamos un ejemplo clásico:

    #include <iostream>
    
    int main()
    {
        char* p = "hello!\n";   //yes I know, deprecated conversion
        p[0] = 'y';
        p[5] = 'w';
        std::cout << p;
    }

    La variable p señala el literal de cadena "hello!\n", y las dos asignaciones por debajo de intentar modificar el literal de cadena. ¿Qué hace el programa? De acuerdo a la sección 2.14.5 el párrafo 11 del estándar de C++, invoca un comportamiento indefinido:

    El efecto de intentar modificar un literal de cadena es indefinido.

    Puedo escuchar a la gente gritando «Pero espera, me puede compilar sin problema y obtener la salida yellow» o «¿a Qué te refieres indefinido, los literales de cadena se almacenan en la memoria de sólo lectura, por lo que el primer intento de asignación de resultados en un core dump». Este es exactamente el problema con un comportamiento indefinido. Básicamente, la norma permite que nada le suceda una vez que se invoca un comportamiento indefinido (incluso nasal demonios). Si hay una «correcta» la conducta de acuerdo a su modelo mental de la lengua, que modelo es, sencillamente, un error; El estándar de C++ tiene el único voto, período.

    Otros ejemplos de un comportamiento indefinido incluyen el acceso a una matriz más allá de sus límites, eliminar el puntero null, el acceso a los objetos después de que su vida terminó o escribir supuestamente inteligente expresiones como i++ + ++i.

    Apartado 1.9 del estándar de C++ también menciona un comportamiento indefinido dos menos peligroso hermanos, sin especificar el comportamiento y aplicación definida por el comportamiento:

    La semántica de las descripciones en esta Norma Internacional define parámetros no deterministas máquina abstracta.

    Ciertos aspectos de las operaciones de la máquina abstracta se describen en esta Norma Internacional como aplicación definida por el (por ejemplo, sizeof(int)). Estos constituyen los parámetros de la máquina abstracta. Cada aplicación deberá incluir la documentación que describe sus características y comportamiento en estos aspectos.

    Algunos otros aspectos de las operaciones de la máquina abstracta se describen en esta Norma Internacional como no especificado (por ejemplo, orden de evaluación de argumentos a una función). Donde sea posible, esta Norma Internacional define un conjunto de posibles comportamientos. Estos definen los no deterministas aspectos de la máquina abstracta.

    Algunas otras operaciones se describen en esta Norma Internacional como indefinido (por ejemplo, el efecto de eliminar el puntero nulo). [ Nota: esta Norma Internacional no impone requisitos sobre el comportamiento de los programas que contienen un comportamiento indefinido.nota final de la ]

    Específicamente, la sección 1.3.24 estados:

    Permitido un comportamiento indefinido rangos de ignorando la situación completamente con resultados impredecibles, a comportarse durante la traducción o la ejecución del programa en un documentado característica forma de medio ambiente (con o sin la emisión de un mensaje de diagnóstico), para terminar una traducción o la ejecución (con la emisión de un mensaje de diagnóstico).

    ¿Qué se puede hacer para evitar que se ejecutan en un comportamiento indefinido? Básicamente, usted tiene que leer buena C++ libros por autores que saben lo que están hablando. Tornillo de internet tutoriales. Tornillo bullschildt.

    Es un extraño hecho de que el resultado de la combinación de que esta respuesta sólo cubre C++ pero esta cuestión de etiquetas incluye C. C tiene una noción de «comportamiento indefinido»: se necesita la aplicación para dar mensajes de diagnóstico, incluso si el comportamiento es también declaró a ser indefinido para ciertas violaciones de las reglas (violaciones de restricción).
    Es un comportamiento indefinido debido a que la norma dice que es un comportamiento indefinido, periodo. En algunos sistemas, de hecho, los literales de cadena se almacenan en la lectura-sólo el segmento de texto, y el programa se bloqueará si intenta modificar un literal de cadena. En otros sistemas, el literal de cadena de hecho aparecen cambio. La norma no obliga a lo que tiene que suceder. Eso es lo indefinido que significa un comportamiento.
    ¿Por qué un buen compilador nos permite compilar código que le da un comportamiento indefinido? Exactamente lo que bien puede compilar este tipo de código? ¿Por qué no todos los buenos compiladores nos dan una enorme rojo señal de advertencia cuando estamos tratando de compilar el código que le da un comportamiento indefinido?
    Hay ciertas cosas que no son seleccionable en tiempo de compilación. Por ejemplo, no siempre es posible garantizar que un puntero nulo nunca se eliminan las referencias, pero esto no está definido.
    un comportamiento indefinido ser no determinista. Por ejemplo, es imposible saber de antemano cuál es el contenido de la memoria no inicializada será, por ejemplo. int f(){int a; return a;}: el valor de a puede cambiar entre llamadas a la función.

    OriginalEl autor fredoverflow

  2. 85

    Bueno, esto es básicamente una recta copiar-pegar de la norma

    3.4.1 1 aplicación definida por el comportamiento sin especificar el comportamiento de donde
    cada implementación de los documentos de cómo la
    la elección se realiza

    2 EJEMPLO Un ejemplo de
    la aplicación definida por el comportamiento es el
    la propagación de la bit de orden superior cuando
    un entero con signo que se desplaza a la derecha.

    3.4.3 1 un comportamiento indefinido comportamiento, sobre el uso de no portátiles o errónea
    programa de construcción o de errónea
    de datos, para que este Internacional
    Norma no impone requisitos

    2
    NOTA Posible un comportamiento indefinido
    rangos de ignorar la situación
    completamente de resultados imprevisibles,
    para comportarse durante la traducción
    la ejecución del programa en un documentado
    característica forma de la
    medio ambiente (con o sin el
    la emisión de un mensaje de diagnóstico), a
    la terminación de una traducción o de ejecución
    (con la emisión de un diagnóstico
    mensaje).

    3 EJEMPLO Un ejemplo de
    un comportamiento indefinido es el comportamiento en
    desbordamiento de enteros.

    3.4.4 1 sin especificar el comportamiento uso de un sin especificar valor, u otro comportamiento
    donde esta Norma Internacional
    dispone de dos o más posibilidades y
    no impone requisitos adicionales en
    que es elegido en cualquier instancia

    2
    EJEMPLO Un ejemplo de no especificado
    el comportamiento es el orden en el que el
    argumentos a una función se evalúan.

    ¿Cuál es la diferencia entre la aplicación definidas y las no especificadas en el comportamiento?
    Como dice: basucally la misma cosa, excepto que en el caso de la aplicación definida por la implementación se requiere documento (garantizar) ¿qué es exactamente que va a suceder, mientras que en el caso de los no especificados de la aplicación no es necesario que el documento o garantía de nada.
    Se refleja en la diferencia entre 3.4.1 y 2.4.4.
    Es posible que un compilador para dejar indefinido el comportamiento de la onu en práctica? ¿Qué pasaría? Por ejemplo a[i] = i++ es indefinido. Es posible que un compilador para ser lo suficientemente sofisticados como para ser programado para este evento? Lo que iba a suceder, sería simplemente la salida de azar de la asamblea?
    Hyper-los compiladores modernos pueden hacer mejor que eso. Dado int foo(int x) { if (x >= 0) launch_missiles(); return x << 1; } un compilador puede determinar que desde todos los medios de invocar la función que no de lanzamiento de los misiles invocar un Comportamiento Indefinido, se puede realizar la llamada a launch_missiles() incondicional.

    OriginalEl autor AnT

  3. 53

    Tal vez fácil de redacción podría ser más fácil para la comprensión de la definición rigurosa de las normas.

    aplicación definida por el comportamiento

    El lenguaje dice que tenemos-tipos de datos. El compilador de los proveedores de especificar qué tamaños se utilizan, y proporcionar una documentación de lo que hicieron.

    un comportamiento indefinido

    Usted está haciendo algo mal. Por ejemplo, tiene un valor muy grande en un int que no encaja en char. ¿Como se puede poner ese valor en char? en realidad no hay manera! Podía pasar cualquier cosa, pero lo más sensato sería tomar el primer byte de la int y la puso en char. Es simplemente malo que para asignar el primer byte, pero eso es lo que sucede bajo el capó.

    sin especificar el comportamiento

    Que la función de estos dos se ejecuta primero?

    void fun(int n, int m);
    
    int fun1()
    {
      cout << "fun1";
      return 1;
    }
    int fun2()
    {
      cout << "fun2";
      return 2;
    }
    ...
    fun(fun1(), fun2()); //which one is executed first?

    La lengua no especificar la evaluación, de izquierda a derecha o de derecha a izquierda! Así que no especificada comportamiento puede o mayn no resultar en un comportamiento indefinido, pero sin duda, su programa no debe producir un comportamiento no especificado.


    @eSKay creo que tu pregunta es vale la pena la edición de la respuesta para aclarar más 🙂

    para fun(fun1(), fun2()); no es el
    el «comportamiento definido por la implementación»?
    El compilador tiene que elegir una o la
    otro supuesto, después de todo?

    La diferencia entre la aplicación definidas y las no especificadas, es que el compilador se supone elegir un comportamiento en el primer caso pero no en el segundo caso. Por ejemplo, una aplicación debe tener una y sólo una definición de sizeof(int). Así, no se puede decir que sizeof(int) es de 4 para una parte del programa y de 8 para los demás. A diferencia de los no especificados de comportamiento, donde el compilador puede decir OK voy a evaluar estos argumentos de izquierda a derecha y el siguiente de la función argumentos se evalúan de derecha a izquierda. Puede suceder en el mismo programa, por eso se llama no especificado. De hecho, C++ podría haber sido más fácil si algunos de los no especificados comportamientos se han especificado. Echa un vistazo aquí en El Dr. Stroustrup la respuesta de por que:

    Se afirma que la diferencia
    entre lo que puede ser producido dar
    el compilador de esta libertad y
    que requieren de «ordinario» de izquierda a derecha
    evaluación» puede ser importante. Estoy
    convencen, pero con innumerables
    los compiladores de «ahí fuera» aprovechando
    de la libertad y de algunas personas
    apasionada defensa de la libertad, una
    el cambio sería difícil y podría
    tomar décadas para penetrar en el
    los rincones lejanos de la C y C++
    los mundos. Estoy decepcionado de que no todos los
    los compiladores de advertir en contra de código, tales como
    ++i+i++. Del mismo modo, el orden de evaluación de los argumentos es
    no se ha especificado.

    OMI demasiadas «cosas» están a la izquierda
    indefinido, sin especificar,
    la aplicación definida, etc. Sin embargo,
    eso es fácil de decir y para dar a
    ejemplos de, pero difícil de arreglar. Es
    también debe notarse que no es
    todo lo que difícil evitar la mayoría de
    los problemas y producir portátil
    código.

    para fun(fun1(), fun2()); no es el comportamiento "implementation defined"? El compilador tiene que elegir uno u otro supuesto, después de todo?
    gracias por la explicación. Yo lo entiendo ahora. Por cierto, "I am gonna evaluate these arguments left-to-right and the next function's arguments are evaluated right-to-left" entiendo que este can suceder. ¿De verdad, con compiladores que utilizamos en estos días?
    Usted tiene que pedir a un gurú acerca de este que puso sus manos sucias con muchos compiladores 🙂 AFAIK VC evalúa los argumentos de la derecha a la izquierda de siempre.
    Sin duda puede suceder. Escenario Simple: foo(bar, boz()) y foo(boz(), bar), donde la barra es un int y boz() es una función que devuelve int. Asumir una CPU donde los parámetros se espera que sea aprobada en los registros R0-R1. La función de los resultados se devuelven en R0; funciones de la basura R1. La evaluación de «la barra» antes de «boz()» obligaría a guardar una copia de la barra de algún otro lugar antes de llamar a boz() y, a continuación, la carga que la copia guardada. La evaluación de «la barra» después de «boz()» evitar un almacén de memoria y volver a buscar, y es una optimización muchos compiladores haría independientemente de su orden en la lista de argumentos.
    Yo no sé acerca de C++ pero el C estándar dice que una conversión de int a char es definido por la implementación o incluso bien definidos (dependiendo de los valores reales y signedness de tipos). Ver C99 §6.3.1.3 (sin cambios en C11).

    OriginalEl autor AraK

  4. 22

    De la oficial C Justificación Documento

    Los términos no especificado comportamiento, indefinido comportamiento, y aplicación definida por el comportamiento se utilizan para clasificar el resultado de la escritura de programas cuyas propiedades de la Norma no es, o no, describir completamente. El objetivo de la adopción de esta categorización es permitir una cierta variedad entre las implementaciones que permite que la calidad de la implementación a ser una fuerza activa en el mercado, así como para permitir que ciertas extensiones populares, sin quitar los cachet de conformidad a la Norma. El apéndice F de la Norma catálogos de aquellas conductas que caen en una de estas tres categorías.

    Sin especificar el comportamiento da el implementador algunos latitud en la traducción de programas. Esta latitud no se extiende tan lejos como el no traducir el programa.

    Un comportamiento indefinido da el implementador de la licencia no para atrapar a ciertos errores de programación que son difíciles de diagnosticar. También identifica las áreas de posible conforme extensión del lenguaje: el implementador puede aumentar el idioma al proporcionar una definición de la oficialmente un comportamiento indefinido.

    Aplicación definida por el comportamiento da un implementador de la libertad de elegir el enfoque adecuado, pero es necesario que esta elección se explica al usuario. Comportamientos designado como la aplicación definidos son generalmente aquellos en los que un usuario podría hacer significativa la codificación de decisiones basadas en la definición de la implementación. Los ejecutores deben tener en cuenta este criterio a la hora de decidir cómo de extensa una definición de la implementación debe ser. Como con los no especificados de comportamiento, el solo hecho de no traducir la fuente que contiene la aplicación definida por el comportamiento no es una respuesta adecuada.

    Hiper-moderno del compilador escritores también a lo que es «un comportamiento indefinido» como dar compilador de escritores de licencia para asumir que los programas nunca recibirá insumos que le causa un Comportamiento Indefinido, y para cambiar arbitrariamente todos los aspectos de la manera en que los programas se comportan cuando reciben tales insumos.
    Otro punto que me acabo de dar cuenta: C89 no utiliza el término «extensión» para describir las características que estaban garantizados en algunas implementaciones, pero otros no. Los autores de C89 reconocido que la mayoría de las implementaciones actuales trataría firmado la aritmética y la aritmética sin signo idéntico excepto cuando los resultados fueron utilizados en ciertas maneras, y dicho tratamiento se aplica incluso en el caso de firmado el desbordamiento; no se lista en la que como una extensión en el Anexo J2, sin embargo, que me sugiere que lo veían como un estado natural de las cosas, en lugar de una extensión.

    OriginalEl autor Johannes Schaub – litb

  5. 8

    Un Comportamiento indefinido vs Comportamiento no especificado tiene una breve descripción de la misma.

    Su resumen final:

    Para resumir, sin especificar el comportamiento general es algo que no debería
    preocuparse, a menos que su software se requiere para ser portátil.
    Por el contrario, un comportamiento indefinido siempre es indeseable y debe nunca
    ocurrir.

    Hay dos tipos de compiladores: aquellos que, a menos que expresamente se especifique lo contrario, de interpretar la mayoría de las formas de Comportamiento Indefinido como volver a caer en conductas características documentadas por el entorno subyacente, y aquellos que, por defecto, sólo útil exponer los comportamientos que el Estándar caracteriza como la Aplicación Definida. Cuando el uso de los compiladores del primer tipo, muchas cosas de el primer tipo se puede hacer de manera eficiente y segura el uso de la UB. Los compiladores para el segundo tipo sólo será adecuado para este tipo de tareas si se proporcionan opciones para garantizar el comportamiento en tales casos.

    OriginalEl autor Anders Abel

  6. 6

    Históricamente, tanto de la Implementación Comportamiento Definido y un Comportamiento Indefinido representado situaciones en las que los autores de la Norma, se espera que la gente de la escritura de la calidad de las implementaciones podría utilizar su juicio para decidir qué del comportamiento de las garantías, si las hubiere, sería útil para los programas en el campo de la aplicación que se ejecuta en la intención de los objetivos. Las necesidades de high-end de la compuadora código son muy diferentes de los sistemas de bajo nivel de código, y tanto la UB y el BID dar compilador escritores flexibilidad para satisfacer las diferentes necesidades. Ni categoría mandatos que las implementaciones se comportan de una manera que es útil para cualquier propósito particular, o incluso para cualquier propósito. La calidad de las implementaciones que dicen ser adecuado para un propósito en particular, sin embargo, deben comportarse en una forma acorde con tal propósito si la Norma requiere o no.

    La única diferencia entre la Aplicación Definida por el Comportamiento y Comportamiento Indefinido, es que el primero requiere que las implementaciones de definir y documentar una constante de comportamiento incluso en los casos donde nada de lo que la aplicación podría hacer sería útil. La línea divisoria entre ellos no es si en general sería útil para implementaciones para definir comportamientos (compilador escritores deben definir útil cuando los comportamientos prácticos si la Norma les exige o no), pero si podría haber implementaciones donde la definición de un comportamiento sería simultáneamente costoso e inútil. Un juicio que tales implementaciones pueden existir no de cualquier manera, forma o forma, implican ningún juicio acerca de la utilidad de sostener un comportamiento definido en otras plataformas.

    Por desgracia, desde mediados de la década de 1990 compilador escritores han comenzado a interpretar la falta de comportamiento mandatos como un juicio de comportamiento que garantiza no vale la pena el costo, incluso en campos de aplicación donde son vitales, e incluso en sistemas que cuestan prácticamente nada. En lugar de tratar de la UB como una invitación a un criterio razonable, compilador de los escritores han comenzado a tratarla como una excusa no para hacerlo.

    Por ejemplo, dado el siguiente código:

    int scaled_velocity(int v, unsigned char pow)
    {
      if (v > 250)
        v = 250;
      if (v < -250)
        v = -250;
      return v << pow;
    }

    una complementaria aplicación no tiene que gastar ningún esfuerzo
    de ningún tipo para el tratamiento de la expresión v << pow como complementaria de turno
    sin tener en cuenta si v fue positivo o negativo.

    El preferido de la filosofía entre algunos de los actuales escritores de compiladores, sin embargo, sugieren que debido a que v sólo puede ser negativo si el programa se va a participar en un Comportamiento Indefinido, no hay ninguna razón para que el programa clip el rango negativo de v. Aunque la izquierda desplazamiento de los valores negativos se utiliza para ser admitidos en cada uno de compilador de importancia, y una gran cantidad de código existente se basa en que el comportamiento, la filosofía moderna sería interpretar el hecho de que la Norma dice que a la izquierda desplazamiento de los valores negativos se UB en el sentido de que los programadores de compiladores deben sentirse libres de ignorar.

    Pero el manejo de un comportamiento indefinido en una bonita manera no salen gratis. La razón por la que los compiladores modernos exhiben tan extraño comportamiento, en algunos casos, de la UB es que son implacablemente optimizar y hacer el mejor trabajo en el que, tienen que ser capaces de asumir que la UB nunca se produce.
    Pero el hecho de que << es UB en números negativos es un poco desagradable trampa y me alegro de ser recordado de que!
    Por desgracia, el compilador de los escritores no importa que ofrece flojo comportamiento de las garantías más allá de los estipulados por la Norma a menudo puede permitir un enorme aumento de la velocidad en comparación con los que requieren que el código de evitar a toda costa cualquier cosa que no sea definido por el Estándar. Si un programador no se preocupa de si i+j>k los rendimientos de 1 o 0 en los casos donde la adición desbordamientos, siempre que no tiene otros efectos secundarios, un compilador puede ser capaz de hacer algo masivo de las optimizaciones que no sería posible si el programador escribió el código como (int)((unsigned)i+j) > k.
    Para ellos, si compilador X puede tomar una estrictamente conforme con el programa para hacer alguna tarea T y el rendimiento de un archivo ejecutable que es un 5% más eficiente que el compilador Y daría con ese mismo programa, lo que significa que X es mejor, incluso si Y podría generar código que hizo la misma tarea tres veces de la forma más eficiente dado un programa que explota a los comportamientos que Y garantías pero X no.

    OriginalEl autor supercat

  7. 5

    Definido por la implementación-

    Ejecutores desea,debe estar bien documentado,la norma da opciones, pero seguro que para compilar

    No especificado –

    Mismo como de la implementación definido, pero no documentado

    Indefinido-

    Cualquier cosa que pueda suceder,tomar el cuidado de él.

    Creo que es importante tener en cuenta que el significado práctico de «undefined» ha cambiado a lo largo de los últimos años. Solía ser que dado uint32_t s;, la evaluación de 1u<<s cuando s es de 33 podría ser esperado tal vez el rendimiento de 0 o tal vez el rendimiento 2, pero no hacer nada más extravagantes. Nuevos compiladores, sin embargo, la evaluación de 1u<<s puede causar un compilador para determinar que debido a s debe haber sido por lo menos 32 de antemano, cualquier código antes o después de que la expresión que sólo sería relevante si s había sido de 32 o mayor puede ser omitido.

    OriginalEl autor Suraj K Thomas

  8. 4

    Estándar de C++ n3337 § 1.3.10
    aplicación definida por el comportamiento

    comportamiento, para un correcto programa de construcción y rectificación de sus datos, que
    depende de la aplicación y que cada implementación de los documentos de

    A veces el Estándar de C++ no imponer comportamiento particular en algunas construcciones, pero dice que en lugar de que un determinado bien definidas, el comportamiento tiene que ser elegido y describe por un tipo particular de aplicación (versión de la biblioteca). De manera que el usuario todavía puede saber exactamente cómo se programa comportan aunque la Norma no describe este.


    Estándar de C++ n3337 § 1.3.24
    un comportamiento indefinido

    comportamiento para que esta Norma Internacional no impone requisitos
    [ Nota: Indefinido comportamiento se puede esperar cuando se esta Internacional
    Norma omite ninguna definición explícita de comportamiento o cuando un programa
    utiliza una construcción errónea o datos erróneos. Permisible indefinido
    el comportamiento de los rangos de ignorar la situación por completo con
    resultados impredecibles, a comportarse durante la traducción o programa
    ejecución en un documentado característica forma del medio ambiente
    (con o sin la emisión de un mensaje de diagnóstico), para la terminación de
    una traducción o la ejecución (con la emisión de un diagnóstico
    mensaje). Muchos errónea programa de construcciones de no engendrar indefinido
    comportamiento; ellos están obligados a ser diagnosticados. — nota final ]

    Cuando el programa de encuentros concepto que no está definido de acuerdo con el Estándar de C++ se permite hacer lo que quiere hacer ( tal vez enviar un correo electrónico a mí, o tal vez enviar un correo electrónico a usted o tal vez ignorar el código completo).


    Estándar de C++ n3337 § 1.3.25
    sin especificar el comportamiento

    comportamiento, para un correcto programa de construcción y rectificación de sus datos, que
    depende de la aplicación [ Nota: La aplicación no es
    necesario para documento en el que se produce un comportamiento. La gama de posibles
    comportamientos es generalmente definidos por esta Norma Internacional. — final
    nota ]

    Estándar de C++ no imponer comportamiento particular en algunas construcciones, pero dice que en lugar de que un determinado bien definidas, el comportamiento tiene que ser elegido ( bot no es necesario describe) por la implementación particular (versión de la biblioteca). Así, en el caso cuando no hay ninguna descripción ha proporcionado puede ser difícil para el usuario saber exactamente cómo será el programa de comportarse.

    OriginalEl autor 4pie0

  9. -1

    Hay muchas construcciones que deben comportarse en una útil y predecible en algunos casos, pero no puede ser prácticamente hecho para hacerlo en todos los casos en todas las implementaciones. A menudo, el conjunto de casos en los que un constructo debe ser utilizable dependerá de la plataforma objetivo y campo de aplicación. Debido a que la aplicación para diferentes objetivos y campos debe manejar diferentes conjuntos de casos, las vistas Estándar, la cuestión de que los casos de manejar como la Calidad de la puesta en cuestión. Además, debido a que los autores de la Norma no vieron la necesidad de prohibir «conformes» implementaciones de ser de tan mala calidad como para ser inútil, ya que a menudo no se molestan explícitamente el mandato de comportamiento de los casos se espera que todos los no-basura implementaciones para apoyar incluso sin un mandato.

    Por ejemplo, el código:

    struct foo {int x;} = {0};
    int main(void)
    {
      foo.x = 1;
      return foo.x-1;
    }

    utiliza un lvalue de tipo int [es decir,foo.x] para acceder al valor almacenado de un objeto de tipo struct foo, aunque N1570 6.5p7 no contiene nada que pueda permitir a un objeto de tipo struct foo al ser consultado, salvo a través de un lvalue de tipo struct foo o un lvalue de un tipo de carácter, ni la Norma contener cualquier idioma que eximiría struct-miembro-de acceso a las expresiones de los requisitos de 6.5p7.

    Obviamente, cualquier compilador que no puede manejar simple struct-miembro-de acceso a las expresiones deben ser considerados como de muy baja calidad y probablemente no es adecuado para casi cualquier cosa. En consecuencia, debe ser razonable esperar que cualquier persona que busca para producir una calidad de ejecución apoyará tal construcción, independientemente de si o no el Estándar de mandatos. Siempre que el compilador de escritores podrían ser de confianza de hacer un esfuerzo de buena fe para producir la calidad de los compiladores que son adecuados para sus propósitos, y ser abierto acerca de los fines para los que sus compiladores son o no son adecuados, no habría ninguna razón para tener el Estándar de los residuos de tinta tratando de estado de cosas que deberían ser obvias. Muchas de las acciones que debe tener utilizable y predicción de comportamientos son, de hecho, un Comportamiento Indefinido debido a que los autores de la Norma de confianza compilador de escritores de ejercer un juicio, en lugar de utilizar el hecho de que las acciones invocar un Comportamiento Indefinido como una excusa para lanzar el juicio por la ventana.

    OriginalEl autor supercat

Dejar respuesta

Please enter your comment!
Please enter your name here