Lista de incompatibilidades conocidas GNU C++ 2.7.2 y BC++ 4.5. (y a veces otros compiladores)

Muchas veces sucede que un programa que compila y funciona perfectamente en nuestra máquina UNIX no compila, o no funciona cuando lo pasamos a nuestro BC++. Si queremos desarrollar aplicaciones verdaderamente multiplataforma, es mejor tener en cuenta una serie de cosas a la hora de escribir el código. Como regla general, no es cierto que Esto compila sin problemas en el compilador de la GNU, no tendría porqué causar problemas en {B,V}C++.

Esta lista la he hallado por experiencia propia. Probablemente haya muchas mas, y son tanto incompatilibidades en tiempo de ejecución como en tiempo de compilacion.


Errores en tiempo de compilación

  1. BC++ no admite new (foo*), hay que sustituirlo por new foo *. ¿Porqué? Quien lo sabe...
  2. BC++ no admite cout << [puntero]. Sin embargo g++ si lo admite.
  3. BC++ no admite declaración de parámetros por defecto en la declaración y en la implementación. g++ 2.7.2 si lo admite.
  4. Seguimos con los parámetros por defecto. Segun el ARM, p 331, un operador sobrecargado no puede tener parametros por defecto. BC++ sigue esta clara directiva, lo cual es la misma puñeta, pero g++ 2.7.2 no lo hace.
  5. BC++ hace cosas raras, indeterminadas con los templates. Todavía no lo tengo muy claro. Para empezar, la instanciacion de los templates en g++ solo se lleva a cabo si se usa efectivamente el template. Codigo que no se usa, no se compila, y por tanto no provoca errores. Sin embargo, BC++ compila todo lo que pilla, y quizas haga bien, porque pilla errores que g++ no lo hace (al menos con la opcion de compilación smart, que no se donde tendrá la inteligencia ). Si se usa otra de las opciones de generacion de templates, por ejemplo la de templates externos, se parece un poco mas a lo que hace g++; al menos no trata de generar siempre los templates, con lo cual da problemas.
  6. Más problemas con los templates: g++ admite
    template <class T>
    class zipi{
    	friend f( zipi& _var);
    }
    
    Aunque también admite
    template <class T>
    class zipi{
    	friend f( zipi<T>& _var);
    }
    
    BC++ solo admite la segunda forma.
  7. [Proporcionado por Victor] Esto creo que es un error del gcc, porque no debería de compilar correctamente.

    El caso es que con gcc tengo:

    cin >> numArt;
    float invRate[numArt];
    
    y va genial. Sin embargo el BC++ dice que numArt debe ser una constante, nada de una variable que se instancia al valor que uno quiera.

Incompatibilidades con el CC 4.2 de SGI

De este mejor es no hablar. Para empezar, no permite inicializar una clase dentro de otra clase, por ejemplo
class foo{
	class bar{
		unsigned baz;
	}
}
pero por lo menos es educado y pide perdon diciendo que todavia no esta implementado. Los templates, ademas, se comportan de forma totalmente diferente, tanto en sintaxis (por ejemplo, todavia no tengo claro como declarar el ctor de una clase template).

Los friend se comportan de forma totalmente diferente, y cuando mete uno un template, en general, se hacen un lio. A todos aquellos que tengan el CC de SGI, les aconsejo que se pasen sin pensarlo al de la gnu


Incompatibilidades con el CC de Sun


Errores en tiempo de ejecución

  1. g++ admite punteros no inicializados sin problemas. Sin embargo, si hay algun puntero no inicializado en un objeto, el código generado por BC++ se quedará colgado cuando se llame al destructor. Esto se debe a que el comportamiento de un puntero no inicializado no esta muy bien definido, y quizás sea un fallo de g++ por permitirlo.

Incompatibilidades de la libreria

  1. En muchos casos, gcc admite const y BC++ no. Por ejemplo, al inicializar un istrstream, gcc lo admite, y BC++ no, dando un error...
Cualquier sobre esta página, trataré de incluirla.
Has sido el visitante número .


[JJ J. J. Merelo * jmerelo@geneura.ugr.es[E-MAIL]
Equipo GeNeura -- GeNeura Team
Departamento de Electrónica y Tecnología de los Computadores
Universidad de Granada Granada (España)
Phone: +34-58-243162; Fax: +34-58-243230