c++ - partes - que es un compilador en programacion
¿Por qué los trigrafos generan errores en los compiladores modernos de C++? (4)
GCC es alérgico a los trigrafos. Tienes que habilitarlos explícitamente:
gcc -trigraphs ...
El manual de GCC 4.7.1 dice:
-trigraphs
Soporta trigrafos ISO C La opción
-ansi
(y-std
opciones-std
para una estricta conformidad con ISO C) implica-trigraphs
.
También dice:
-Wtrigraphs
Advierta si se encuentran trigrafos que puedan cambiar el significado del programa (los trigrafos dentro de los comentarios no son advertidos). Esta advertencia es habilitada por
-Wall
.
Incluso en los compiladores GCC, los trigrafos no se compilan sin especificar explícitamente el atributo trigraph.
#include<stdio.h>
int main()
{
int a=4;
if((a==4) ??! (a==5))
printf("/nHello world!");
return 0;
}
Este programa se guarda como try.c se compila en GCC Compiler solo cuando especificamos gcc -Wall -trigraphs try.c
y todavía muestra advertencias. ¿Puede solicitar algunos compiladores que tratarán y manejarán trigraphs sin ningún error o advertencia?
Los trigraphs se convierten en una etapa muy temprana de compilación, e incluso se pueden reemplazar en literales de cadena. Esto hace que los errores que surgen de las traducciones de trigraph sean muy difíciles de detectar (peor si se considera la depuración usando un registro y se encuentra el resultado en su fuente).
La advertencia que ve le ayudará a detectar rápidamente a un posible culpable para rastrear el origen del error. Básicamente, te está advirtiendo que algo podría no ser lo que crees que es.
Los trigraphs fueron introducidos por el estándar ANSI C de 1989, y se conservan en todos los estándares posteriores de C. También aparecen en el primer estándar ISO C ++, publicado en 1998, y en todos los estándares posteriores de C ++ hasta C ++ 14. (Los trígrafos se eliminarán en C ++ 17. Gracias a Jonathan Leffler y Dyp por rastrear los detalles).
No son una característica opcional en ninguno de los dos idiomas; todos los compiladores conformes deben soportarlos e interpretarlos según lo especificado por el estándar de idioma respectivo.
Por ejemplo, si este programa:
#include <stdio.h>
int main(void) {
if (''|'' == ''??!'') {
puts("ok");
}
else {
puts("oops");
}
return 0;
}
imprime ¡ oops
, entonces su compilador no es conforme.
Pero muchos, tal vez la mayoría, los compiladores de C no se ajustan por completo de forma predeterminada. Siempre que se pueda hacer que un compilador cumpla con el estándar de alguna manera, es lo suficientemente bueno en lo que respecta al estándar. (gcc requiere -pedantic
y -std=...
para hacer esto).
Pero incluso si un compilador cumple totalmente, no hay nada en el estándar que prohíba a un compilador advertir sobre lo que quiera. Un compilador de C conforme debe diagnosticar cualquier violación de una regla o restricción de sintaxis, pero puede emitir tantas advertencias adicionales como quiera, y no necesita distinguir entre los diagnósticos requeridos y otras advertencias.
Los trigraphs se usan muy raramente. La gran mayoría de los sistemas de desarrollo admiten directamente todos los caracteres para los cuales los trigrafos sustituyen: #
, [
, /
, ]
, ^
, {
, |
, }
, ~
.
De hecho, es probable que los trigrafos se usen accidentalmente con más frecuencia de la que se usan correctamente:
fprintf(stderr, "What just happened here??!/n");
La advertencia sobre los trigrafos que podrían alterar el significado de un programa (en relación con el significado que tendría si el lenguaje no tuviera trigrafos) está permitida por el estándar ISO y en mi humilde opinión es perfectamente razonable. La mayoría de los compiladores probablemente tengan opciones para desactivar tales advertencias.
Por el contrario, para un compilador C ++ 17 que no implementa trigraphs, sería razonable advertir acerca de secuencias que se habrían tratado como trigraphs en C ++ 14 o anterior. Una vez más, una opción para desactivar tales advertencias sería algo bueno.
Se pueden desactivar por defecto .
"Algunos compiladores admiten una opción para desactivar el reconocimiento de trigrafos o deshabilitar los trigrafos por defecto y requieren una opción para activarlos".
GCC podría ser uno de estos últimos . Aunque, por defecto, debería ignorarlo con advertencia , pero en este caso ignorar podría estar causando el error de compilación