2011-10-15 33 views
8

Estoy probando algunos fragmentos que encontré en la web usando g ++ de MinGW. Este es el compilador de C++ ... ¿por qué compila C correctamente ... por qué las personas se entrelazan C y C++?Cuándo usar printf/scanf vs cout/cin?

La pregunta concreta es: ¿Es O.K.? para usar tanto C como C++ y compilar bajo g ++. Si la respuesta es sí, esto me facilita la vida ya que no tengo que modificar el código.

extraño que parezca ... para conseguir un poco de C++ para trabajar, sobre todo cuando se pasa una cadena a una constructora ifstream Requiere una cadena tipo C ...

Mi conjetura sería que debido a que C++ depende de C construye en veces está bien escribir juntos los dos idiomas.

Sin embargo, como una cuestión de estilo que debe establecerse en cout/o cinprintf/scanf.

+0

C es esencialmente un subconjunto de C++. Para cuando salió C++, había tonos de código en C (todavía lo son), por lo que no podía esperar que los dos idiomas fueran incompatibles. – FailedDev

+1

Nota: a partir de C++ 11, también puede construir un 'std :: ifstream' a partir de' const std :: string & '(por ejemplo, consulte la sección 27.9.1.7 del [último borrador] (http: // www. open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)). – reima

Respuesta

5

Hay algunas rarezas en las que se necesita char*. Puede cerrar la brecha utilizando el método .c_str() de std::string para obtener uno.

En su mayor parte, el subconjunto C de C++ es compatible. Exactamente cómo no es compatible, no es probable que la materia en su mayor parte:

http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

Si estás compilando fragmentos de código C bajo un compilador de C++, asegúrese de cambiar a utilizar la "c "formato lib en tu incluye ...por ejemplo #include <cstdio> en lugar de #include <stdio.h>

Is it bad practice to use a C header instead of its C++ equivalent in C++ (e.g. stdio.h instead of cstdio)?

Para un argumento bastante motivada del mismo Bjarne sobre por qué para evitar scanf, echa un vistazo al principio de este artículo:

http://www2.research.att.com/~bs/new_learning.pdf

Hay un montón de los beneficios de usar iostreams en lugar de printf también:

'printf' vs. 'cout' in C++

+0

Bueno, su argumento sobre printf y scanf parece estar completamente centrado en scanf. Usar printf vs. cout es en gran medida una cuestión de opinión, ya que ambos tienen ventajas y desventajas. Formatear cosas con flujos es mucho más complejo de lo necesario y el aspecto OOP de las secuencias puede ocultar errores (por ejemplo, 'cout << this' vs.' cout << * this'). – Voo

+0

Actualizado con un enlace de apoyo para why-not-use-printf. No importa * tanto *, es verdad. Pero sigo pensando que el concepto mismo de usar un lenguaje de formato mini sin marcar en una cadena es antitético al espíritu de C++. Es algo así como los casos que he visto donde alguien hizo un "formato XML" que era un poco de encabezado y grandes manchas de CDATA. En ese momento, usted está en un archivo .XML * pero sus datos no son realmente "XML". Lo mismo si está "programando en lenguaje printf" y pasando por alto el sistema de tipo C++ y no permitiendo que todo se compruebe en tiempo de compilación. – HostileFork

+0

No estoy tan seguro de si la seguridad de tipo es una gran discusión ya que las transmisiones aceptan casi cualquier cosa, por lo que aún puede obtener resultados no deseados fácilmente. Además, gcc hace que las listas de argumentos que no coincidan sean menos problemáticas (aún lo es, especialmente en otros compiladores). Poder heredar i/ostream es bueno en algunas situaciones sin dudas. Algunas personas prefieren una sintaxis sobre la otra, por lo que no es una ventaja para uno u otro. La única cosa que aborrezco sobre las transmisiones en C++ es su capacidad de formateo. Intente hacer algo como '%. * S' de manera eficiente con las transmisiones. – Voo

0

Si usa C++, entonces use C++. (cin, cout)
¿Por qué fstream lleva rompecabezas de cadenas de c yo también.

2

Is it O.K. para usar tanto C como C++ y compilar bajo g ++.

Sí, está bien mezclar los dos idiomas. Esto es común con el código que comenzó como C, pero luego se agregaron más y más características de C++ (obviamente, alguien cambió el compilador en el camino).

Generalmente, el código C se compilará y ejecutará con un compilador C++. Hay muchas excepciones posibles, como el uso de palabras clave como class y virtual para los nombres de las cosas en el código C, o las reglas relajantes de lanzamiento de C.

A menudo escuchará a las personas decir "son idiomas muy diferentes". Eso es porque cualquier pregunta de programación que usted hace probablemente tenga una respuesta diferente dependiendo del idioma que esté tratando de usar. Sin embargo, también hay muchas similitudes y aspectos de compatibilidad con versiones anteriores.

+1

No realmente. Hay cosas en C que no se compilarán como C++. –

+0

@CatPlusPlus: actualicé mi respuesta con más explicaciones. –

3

El lenguaje C++ hereda gran parte de su funcionalidad principal de C. Esto se debe a que C++ se derivó de C. El estándar C++ incluye, por referencia, gran parte del estándar C. Por lo tanto, puede usar el compilador de C++ para escribir código utilizando construcciones C, modismos y paradigmas. Hacerlo a menudo se conoce como usar C++ "como una mejor C."

Lo largo y lo corto de lo anterior es afirmativo, puede usar printf en código C++. Hacerlo está explícitamente permitido por el Estándar.

Sin embargo, esto a menudo descuidará muchas de las características que definen C++. Dejaré esa conversación por otra pregunta pero baste decir que mucha gente te dirá simplemente "no hagas eso" o "eso no es C++". Esto deja de lado las razones por las que es posible que no desee utilizar printf en un programa C++ o, por cierto, por qué lo desea. Pero puede estar seguro de que está técnicamente permitido.

+0

Publicación desde un asidero. Muchos errores tipográficos Lo siento. –

Cuestiones relacionadas