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
- BC++ no admite new (foo*), hay que sustituirlo por
new foo *. ¿Porqué? Quien lo sabe...
- BC++ no admite cout << [puntero]. Sin embargo g++ si lo
admite.
- 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.
- 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.
- 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.
- 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.
- [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
- Por alguna razón, el CC no acepta argumentos por defecto
en los templates. Supongo que se deberá a que en tiempo
de compilacion no se sabe cual va a ser el tipo de un template,
pero si el argumento no es del tipo con el cual se instancia el
template, no lo entiendo.
Errores en tiempo de ejecución
- 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
- En muchos casos,
gcc admite const y
BC++ no. Por ejemplo, al inicializar un istrstream,
gcc lo admite, y BC++ no, dando un error...
Has sido el visitante número
.
J. J. Merelo
jmerelo@geneura.ugr.es![[E-MAIL]](/common/mail.gif)
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