Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Consejos para C++ multiplataforma

Iniciado por tewe76, 02 de Febrero de 2009, 08:04:37 AM

« anterior - próximo »

davur

Cita de: Prompt en 09 de Febrero de 2009, 10:03:32 AM
Solo decir que, no hay nada que compiles con GCC del lenguage C/C++ standard que no compile luego en Visual C. Porque GCC va de la mano del ANSI estrictamente.

No es cierto. Si bien tanto g++ como MVC++ cumplen con casi la totalidad del estándar actual, este último reserva partes a la implementación de manera explícita.

En todo caso, habría que matizar el concepto de adecuación al estándar, que puede interpretarse de varias maneras.

Prompt

Cita de: davur en 09 de Febrero de 2009, 08:09:12 PM
Cita de: Prompt en 09 de Febrero de 2009, 10:03:32 AM
Solo decir que, no hay nada que compiles con GCC del lenguage C/C++ standard que no compile luego en Visual C. Porque GCC va de la mano del ANSI estrictamente.

No es cierto. Si bien tanto g++ como MVC++ cumplen con casi la totalidad del estándar actual, este último reserva partes a la implementación de manera explícita.

En todo caso, habría que matizar el concepto de adecuación al estándar, que puede interpretarse de varias maneras.

Has tenido en cuenta, que la conio.h, threads o sockets no son ANSI?

davur

Cita de: Prompt en 09 de Febrero de 2009, 08:24:14 PM
Cita de: davur en 09 de Febrero de 2009, 08:09:12 PM
Cita de: Prompt en 09 de Febrero de 2009, 10:03:32 AM
Solo decir que, no hay nada que compiles con GCC del lenguage C/C++ standard que no compile luego en Visual C. Porque GCC va de la mano del ANSI estrictamente.

No es cierto. Si bien tanto g++ como MVC++ cumplen con casi la totalidad del estándar actual, este último reserva partes a la implementación de manera explícita.

En todo caso, habría que matizar el concepto de adecuación al estándar, que puede interpretarse de varias maneras.

Has tenido en cuenta, que la conio.h, threads o sockets no son ANSI?

Te refieres a librerías que no forman parte del estándar. Yo me refiero a partes del estándar reservadas a la implementación como, por ejemplo, el tipo de std::set::iterator.

Prompt

Hombre davur! hablamos de escribir std::iterator y que compile en ambas partes. El standard ANSI dice que debe existir eso porque es parte del lenguaje. Luego yá como se haga o no por dentro es cosa de cada S.O. existiendo una alternativa de código libre con GCC.

Pero es obvio que cada S.O. hace su propia implementación o usa una alternativa open source.

Yo creo que esto era obvio y no por ello deja algo de ser standard. 8)

davur

Cita de: Prompt en 09 de Febrero de 2009, 08:47:36 PM
Hombre davur! hablamos de escribir std::iterator y que compile en ambas partes. El standard ANSI dice que debe existir eso porque es parte del lenguaje. Luego yá como se haga o no por dentro es cosa de cada S.O. existiendo una alternativa de código libre con GCC.

Pero es obvio que cada S.O. hace su propia implementación o usa una alternativa open source.

Yo creo que esto era obvio y no por ello deja algo de ser standard. 8)

¡Es que tampoco me refiero a eso!

Me refiero a que es posible escribir código que utilice std::set::iterator/std::set::const_iterator que compile en MVC++ y no compile en g++. El código es estándar, en el sentido de que se adecúa a la restricción de 'definido por la implementación' del estándar, pero no es portable entre compiladores.

Prompt

Pues vas a tener que afinar más porque no me convence.

Por ejemplo en MSVC vector::erase devuelve el iterador al siguiente elemento. Cosa que aún parece ser que no es standard hasta la X0 (o como demonios se llame el nuevo standard), como GCC usa estrictamente el standard su implementación de vector::erase no devuelve el iterador al siguiente elemento. Cosa que jode, por cierto.

Pues MSVC vá y lo mete porque ve que es util, necesario y debe estar.

No se cual será el caso de ese set::iterator. Se me ocurren otros como de templates que el standard obliga a adjuntar typename en un determinado caso con ::iterator.

Todo esto se reduce a que si compila en GCC va a compilar en donde sea. Si nó, que me pongan un ejemplo!!   ::)

Pero bueno, se por donde vas davur.

Un saludo.

davur

Un ejemplo (que no es muestra de buen hacer, sino simplemente eso, un ejemplo algo artificial):


#include <iostream>
#include <iterator>
#include <set>
#include <string>

int main()
{
std::set<std::string> words;

std::string s;
while (std::cin >> s)
{
(*words.insert(s).first).append('#');
}

std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}


Este código compila en MVC++, pero no en g++. ¿Es estándar o no?

Prompt

Será standard en el sentido que usa las palabras y estructuras standares pero evidentemente cada SO como he dicho implementará internamente eso de cierta manera. Yo me pre-supongo que hay una serie de restricciones a la hora de implementarlo para que siga siendo standard. Que creo que es a lo que te refieres, que ciertamente no lo es.

No obstante, mantengo aquello de "si compila en GCC va a compilar en MSVC", 99% :P no crees?

tewe76

davur, fíjate que tú defiendes: "hay código estándar que no compila en GCC" y Prompt defiende: "el código que compila en GCC es estándar". No son cosas incompatibles, si lo miras bien, así que los dos tenéis razón ::).
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

davur

Es que hay código estándar que no compila en g++, porque g++ no implementa todo el estándar. Y lo mismo se puede decir de todos los demás compiladores actuales de C++, excepto uno.

Y no todo el código que compila en g++ es estándar, porque éste también define sus extensiones particulares.

Pero por supuesto, en la mayoría de casos esto no tiene mayor importancia, porque en cuanto tu aplicación necesita acceso a la tarjeta gráfica (por ejemplo), ya te sales del ámbito del estándar.

tewe76

Creo que sé la respuesta, pero a ver si me lo confirmáis: para hacerlo multiplataforma, lo mejor es que en las rutas se use siempre "/" en vez de "\", ¿no? ("Carpeta/Archivo" en vez de "Carpeta\\Archivo")
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Vicente

Cita de: tewe76 en 24 de Febrero de 2009, 06:42:57 PM
Creo que sé la respuesta, pero a ver si me lo confirmáis: para hacerlo multiplataforma, lo mejor es que en las rutas se use siempre "/" en vez de "\", ¿no? ("Carpeta/Archivo" en vez de "Carpeta\\Archivo")

En realidad, lo suyo sería que le preguntases al sistema operativo cual es su "separator char" y en las rutas usaras ese caracter. Pero vamos, creo que "/" te valdrá en todos los lados.

Un saludo,

Vicente

tewe76

Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

gdl

Cita de: tewe76 en 24 de Febrero de 2009, 06:42:57 PM
Creo que sé la respuesta, pero a ver si me lo confirmáis: para hacerlo multiplataforma, lo mejor es que en las rutas se use siempre "/" en vez de "\", ¿no? ("Carpeta/Archivo" en vez de "Carpeta\\Archivo")

Creo que es mejor que uses boost::filesystem. Mira aquí: http://www.boost.org/  Particularmente en http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm

La idea es que usas un objeto "path" y él ya se encarga de convertir el formato del sistema operativo que sea.

tewe76

Por ahora me quedo con la solución para vagos ::) . Pero tengo que echarle un vistazo a eso del boost, porque no paro de verlo por todos lados...
Gracias, de todas maneras :)
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.