Entiendo que C y C ++ son lenguajes diferentes, pero cuando estaba aprendiendo C ++ siempre me dijeron que C es un subconjunto de C ++ o C ++ es C con clases. Y eso fue bastante cierto hasta la aparición de C ++ x0, C ++ 11 (o el moderno C ++ 11/14/17 en general). De hecho (especialmente cuando se trabaja en sistemas integrados) es muy probable que encuentre código escrito en C ++ pero con muchas partes escritas completamente en lenguaje C puro. Aquí tengo varias preguntas:
- ¿Debo dejar de usar el término C / C ++?
- Si la respuesta a # 1 es sí, ¿cómo llamaría a un programa que usa una combinación de C y C ++?
- Dado que ambos son lenguajes 'diferentes', es probable que en algún momento los compiladores de C ++ dejen de admitir código escrito en el lenguaje C (dado que el C ++ moderno está divergiendo de la mentalidad C para cosas básicas como punteros, manejo dinámico de memoria, etc.)
- ¿Existe ahora alguna colaboración entre las personas que hacen los estándares de C / C ++ para mantener la compatibilidad?
- Si el número 4 es sí, dicha colaboración podría terminar en un futuro cercano con la aparición del moderno c ++ (14/11/17)
Sé que ya hay preguntas similares, pero estoy seguro de que muchas personas comparten estas preguntas, así que estoy muy interesado en obtener buenas respuestas, especialmente para los puntos que tienen que ver con la tendencia C ++ en el futuro cercano.
c++
c
terminology
c++11
rkachach
fuente
fuente
Should I stop using the term C/C++
. Si. Esto solo es utilizado por reclutadores y RRHH. Los ingenieros usarán el términoC
oC++
como idiomas independientes. Si encuentra un ingeniero que mezcla el término, evítelos.Respuestas:
C nunca fue un subconjunto de C ++. El ejemplo más obvio de esto es
int new;
. Esto ha sido así desde C89 y C ++ 98, y los lenguajes solo han crecido más entre sí a medida que surgen nuevos estándares.si
Un archivo fuente está escrito en un idioma u otro. Un programa puede consistir en código de múltiples idiomas trabajando juntos, o un ejecutable producido al vincular diferentes objetos compilados. Diría que el programa fue escrito en C y C ++, "C / C ++" no es un lenguaje.
3) Nunca lo hicieron.
char *a = malloc(10);
. C y C ++ nunca han sido totalmente compatibles durante al menos el tiempo que han tenido estándares ISO (no conozco todos los detalles sobre los días preestandarizados). haga clic en los enlaces o vea a continuación un archivo que esté bien con C89 y versiones posteriores, pero que no sea válido bajo ningún estándar de C ++.4) afaik no, los grupos de trabajo se conocen entre sí, pero los estándares toman las decisiones que son mejores para ellos.
Siempre siento que vale la pena mencionar que C es un subconjunto de Objective-C.
fuente
javac
, pero ¿cuál sería el punto?C/Fortran/sh
tiene sentido ahora? ioccc.org/years-spoiler.html#1986 .No tiene que haber una razón por qué estos términos se unen tan a menudo. Si bien no debe decirle a su maestro de C que su lenguaje es un subconjunto de C ++, aquí hay algo de verdad. Otros ya han expuesto el punto de vista de su maestro. Esto es muy bueno (e ilustrado con ejemplos, etc.). Pero no vivimos en una torre de marfil o en un libro.
A tu gran jefe no podría importarle menos el lenguaje exacto que usaste. Si sabe un poco acerca de la programación, solo dígale que usó C / C ++ y sonará como "Usé un lenguaje que necesita ser compilado en código máquina, con archivos DLL y todas las cosas complicadas". Esta es la parte de "comunicación externa".
Si crea una biblioteca que puede ser interconectada por C y C ++, definitivamente desea llamarla una biblioteca C / C ++. Por supuesto, alguien levantará una mano y preguntará por qué no llama a esto una biblioteca de C que tiene un contenedor de C ++, y de todos modos C ++ puede vincularse a las bibliotecas de C, por lo que no necesita mencionarlo en absoluto. Solo responde: "Sí, tienes razón, esta es una biblioteca C / C ++". Esta es la parte de "comunicación interna".
Si crea un analizador léxico para C ++, se sorprenderá de lo bien que funciona con C. Es posible que incluso no necesite modificarlo todo. Este es el "si parece un pato, etc." parte.
Etc.
La mayoría de los programas en C que he visto compilar (y trabajar) sin modificación como código C ++. No permita que algunas excepciones o programadores dogmáticos (aunque influyentes) engañen su intuición. C y C ++ son tan cercanos, y tan a menudo compatibles, y tan a menudo mezclados y combinados, que se utiliza el término C / C ++. Se utiliza porque es útil para describir este tipo de situaciones en las que realmente no importa si está considerando C o C ++, siempre que no sea Java o PHP . Sabemos que está "mal", pero no nos importa, es más útil que mal.
Puede ser abusado, puede ser estúpido, pero aún así, no estoy seguro de qué beneficio obtendrá al ser más pedante de lo necesario y se niega a comunicarse en términos que otros entiendan. Si se siente incómodo en alguna situación específica, simplemente no use el término genérico C / C ++, sino el relevante para el caso (C o C ++).
No tengas miedo del futuro. Nuestros sistemas operativos están escritos en C. Gran parte de la producción actual de software C / C ++ ocurre en C ++. Esta pareja está aquí para quedarse por bastante tiempo. Nadie tiene interés en que uno sea más incompatible con el otro (al contrario, en realidad).
Para ser específico sobre sus puntos:
1) depende. Sí, cuando podría generar confusión, cuando te sientas incómodo o cuando simplemente esté mal o fuera de contexto. No cuando crees que es adecuado.
2) N / A
3) Creo que no, pero no tengo bola de cristal.
4) ni idea
5) No lo creo, ya que nada empuja en esta dirección
fuente
C/C++
no es claro y, por lo tanto, no es útil. Siguiendo sus ejemplos, aC/C++ library
podría significar una biblioteca C con un contenedor C ++ o una biblioteca C ++ con un contenedor C ++. O podría significar que la biblioteca está compuesta de varios módulos, algunos compilados usando C ++, otros compilados en C. Esto no está claro en absoluto. Para mí, decir que una biblioteca está hechaC and C++
es mucho más clara, oC library with compatibility with C++
también es mucho más clara. Y aquí es la ambigüedad con sólo dos lang, imaginar el uso de esta "estrategia de comunicación" para obtener más ...Yendo en contra de la corriente, diría que depende del contexto .
El término "C / C ++" generalmente no es apropiado cuando se dice algo como "este es un programa C / C ++", pero esto se ha explorado en profundidad en otras respuestas.
Sin embargo, puede haber contextos donde C / C ++ puede ser apropiado.
fuente
or
, no como lógicoxor
. Entonces es uno o ambos. En los listados de trabajos, conoce C o C ++ o ambos. Ahora, siento que mucha gente está siendo religiosa sobre el término. Un buen programador de C estará perfectamente preparado para C ++ independientemente de cuán diferentes sean ambos lenguajes. Comencé a codificar PHP y luego me mudé a Scala (dos lenguajes completamente diferentes) ¿Por qué un programador en C no podría elegir C ++ o viceversa? El término C / C ++ tiene algún mérito si se usa dentro del contexto correcto.Hay muchas diferencias sutiles entre C y C ++. Por ejemplo, en C ++, una
const
variable de alcance global tiene un enlace interno a menos que se declareextern
, pero en C tiene un enlace externo a menos que se declarestatic
. Al decir "C / C ++", el OP está afirmando que la respuesta a su pregunta es la misma tanto en C como en C ++, cuando muy bien podría no serlo. Esto innecesariamente hace las cosas más difíciles para los aspirantes a responder.A veces podemos detectar que el código no es válido en un idioma u otro (por ejemplo, las conversiones implícitas de
void*
un puntero a un objeto no son válidas en C ++). Esto es molesto. ¿Por qué dice "C / C ++" cuando tiene un código válido en C pero no en C ++? ¿Pretendía C, o es solo un error en el código destinado a ser C ++?A veces, la respuesta será diferente según el lenguaje (por ejemplo, existen matrices de longitud variable en C99 pero no en C ++). Si no sabemos de qué idioma estás hablando, tenemos que adivinar o escribir una respuesta para ambos cuando solo uno será realmente útil, porque sabes qué idioma estás usando en realidad; ¡simplemente no nos estás diciendo!
A veces la respuesta realmente es la misma para ambos idiomas, pero es difícil estar seguro. Por ejemplo, creo que C y C ++ tienen las mismas reglas de conversión de enteros, pero para estar realmente seguro, tengo que leer ambos estándares cuidadosamente. Nuevamente, esto me hace hacer el doble de trabajo que sea necesario cuando probablemente solo te interese uno de los idiomas.
De todos modos, para responder a sus otras preguntas:
Si.
Si está enlazando código C y C ++, es aceptable usar ambas etiquetas, pero especifique en qué idioma está cada archivo.
A veces hay cambios importantes, pero son raros y generalmente tienen un impacto limitado (de lo contrario, no se aprueban). Por ejemplo,
auto
en C ++ 11.No creo que colaboren directamente, pero prestan atención a los desarrollos en el otro idioma y tratan de evitar introducir cambios que dificulten la compatibilidad.
Y si realmente quieres saber sobre ambos idiomas, está bien, y puedes decir eso en tu pregunta. Cuando dices "C / C ++", realmente no estoy seguro de lo que quieres decir, y realmente parece que estás asumiendo los dos idiomas.
fuente
struct class
a algo asístruct klass
por exactamente esa razón, y entonces es invariablemente derribado por Linus.C nunca ha sido un subconjunto de C ++. Por ejemplo, C89 no es un subconjunto de C ++ 98.
Algunos ejemplos:
int
vsbool
)Si.
Un programa es C o C ++ (si incluso un programa muy básico puede compilarse con un compilador C o C ++). ¿Qué compilador estás usando para compilarlo? Debería responder a tu pregunta. Harbison y Steele acuñaron el término Clean C para designar un subconjunto común de C y C ++, pero creo que fue una mala idea.
EDITAR : Sin embargo, admito que técnicamente puede vincular archivos de objetos C y C ++ en un solo programa, pero OTH hay muchos lenguajes que se pueden mezclar en un solo programa, por ejemplo, Java y C ++. Creo que usar el término programa C / C ++ solo aumenta la confusión de que está escrito en un solo lenguaje llamado C / C ++.
Hay muchas características (ejemplo: matriz de longitud variable, miembro de matriz flexible
_Generic
, ...) de C99 o C11 que no son compatibles con ninguna versión de C ++.fuente
Algunos programas están escritos en una mezcla de C y C ++
Esto es solo un hecho de la vida. Puede compilar archivos de objetos de C y C ++ y vincularlos. El resultado puede llamarse razonablemente "un programa C / C ++".
Pero ese es solo el programa en su conjunto. ¿Qué pasa con las unidades de compilación individuales?
Hay un subconjunto de C que también es un subconjunto de C ++
Un programa (o unidad de compilación) escrito en ese subconjunto compilará y se comportará igual bajo compiladores C y C ++ conformes. Tal programa o archivo puede llamarse correctamente "un programa C / C ++" o "un archivo C / C ++".
Un programa parcial, como un archivo de encabezado, también se puede usar en programas C y C ++. Dichos archivos de encabezado se pueden denominar correctamente encabezados C / C ++.
Citando al profesor Bjarne Stroustrup:
Entonces sí, existe algo como C / C ++. Es cualquier cosa que sea tanto C válida como C ++ válida.
El preprocesador C es parte del lenguaje C. El preprocesador de C ++ es parte del lenguaje C ++
Puede escribir una unidad de compilación que compilará en C o C ++ y será diferente . Por ejemplo, podría tener una funcionalidad básica compilada en C pero aprovechar una biblioteca C ++ si se compila en C ++.
Si el programa es esencialmente el mismo, pero con características adicionales, no es exactamente incorrecto decir que es el mismo programa. Es lo mismo, pero también diferente.
La mayoría de los programadores de C pueden hacer al menos un poco de C ++ y viceversa.
No es irrazonable llamar a esa persona programador de C / C ++. Sí, probablemente se especialicen en uno, pero ¿hay alguien que sea un programador competente de C o C ++ que, literalmente, no pueda hacer ningún otro lenguaje? En cierto modo, ¿no son todos programadores de C / C ++?
No hay nada de malo en decir "C / C ++". Lo que importa se entiende
El idioma inglés no es una herramienta para expresar silogismos . Usted puede utilizar el Inglés para la lógica, pero por muy poco, y con gran esfuerzo.
Esto se debe a que las palabras no tienen naturalmente significados exactos, sino más bien una vaga nube de denotaciones y connotaciones. Lo que importa es si la gente entiende lo que estás diciendo.
fuente
Absolutamente. No está claro qué pretende expresar esta construcción, excepto, tal vez, la confusión acerca de qué son C y C ++ en nombre de la persona que usa el término.
Dado que esta confusión es una fuente de frustración tan común, muchas personas se han vuelto bastante emocionadas al respecto y la sola aparición de ese término será motivo suficiente para que se vuelvan negativas sobre su contribución. Esto puede parecer una tontería, pero parece ser lo que tenemos.
Recomiendo que en lugar de hablar de "C / C ++" utilice un término que realmente aclare lo que quiere decir.
Si usted está hablando de algo en C que podría o no podría también ser verdad para C ++, simplemente diga C .
Si está hablando de algo en C ++ que podría o no ser cierto para C, simplemente diga C ++ .
Si desea señalar una similitud entre C y C ++, diga C y C ++ .
De hecho, le recomiendo que sea aún más específico y no solo hable sobre "C" o "C ++" sino también sobre la versión precisa. Ambos idiomas están evolucionando y una declaración contundente como
No es ni correcto ni incorrecto.
Como los lenguajes se superponen, cada programa en C contendrá partes que podrían parecerse a C ++ y viceversa. Sin embargo, los autores probablemente habrán decidido utilizar un compilador C o C ++. Entonces, diga "el programa está escrito en C " si está compilado con un compilador de C y "el programa está escrito en C ++ " si usan un compilador de C ++, incluso si pueden negarse a usar las características modernas de C ++. Algunas personas se refieren a código C ++ como C-style C ++ . La ausencia de sobrecarga, excepciones, polimorfismo, plantillas y flujos de E / S son características comunes de dicho código.
Si, en cambio, algunos archivos se escriben en C y se compilan con un compilador de C y algunos otros archivos se escriben en C ++ y se compilan con un compilador de C ++, y luego los archivos de objetos se vinculan entre sí, diría que "el programa se escribe en un mezcla de C y C ++ "como, de hecho, ya lo hizo.
Sin embargo, si, en cambio, los autores se preocuparon por escribir todos y cada uno de los archivos de tal manera que puedan compilarse con un compilador de C o C ++ y el programa resultante haría lo mismo, podría decir que "el programa está escrito en un subconjunto común de C y C ++ ".
Este último suele ser el caso de los archivos de encabezado que deben compartirse entre el código C y C ++. Escribir dicho código no es fácil, por cierto. Si desea enfatizar aún más que solo se usaron tales construcciones que son válidas en C y C ++ y que son ampliamente compatibles con diferentes proveedores de compiladores, el término un subconjunto común portátil de C y C ++ puede usarse para enfatizar esto.
No estoy seguro de entender esta pregunta. Como C y C ++ son lenguajes diferentes, no puede esperar que un compilador para uno acepte un programa escrito para el otro. Sin embargo, los compiladores a menudo se diseñan de forma modular y si un compilador tiene una interfaz C ++ , es muy probable que también tenga una interfaz C. (A continuación, seleccionaría cuál de ellos desea mediante un interruptor de línea de comando o un medio similar). Mientras ambos idiomas se usen ampliamente, parece muy poco probable que esto cambie. Su punto de vista sobre "C ++ moderno" creo que es básicamente una cuestión de buenos estándares de codificación y la biblioteca estándar. Desde el punto de vista del compilador , la evolución de ambos idiomas es más bien convergente que divergente.
Si. El modelo de memoria y la biblioteca de operaciones atómicas introducidas en C ++ 11 y C11 es un buen ejemplo. Parece que los diseñadores de ambos idiomas se dan cuenta de que la compatibilidad es importante y están trabajando para mejorarla. Personalmente, desearía que la colaboración fuera más intensa y los dos grupos de trabajo de ISO quizás incluso se unieran, pero mis deseos no son importantes.
Bjarne Stroustrup habla sobre las diferencias y los puntos en común entre las diversas versiones de C y C ++ en § 44.3 de la cuarta edición del lenguaje de programación C ++ que, irónicamente, se titula "Compatibilidad C / C ++". El uso del término podría ser apropiado en este caso, ya que está claro lo que significa.
Como se discutió anteriormente, sucedió en C ++ 11 y se espera / espera / necesita que vuelva a suceder.
fuente
C / C ++ es la intersección de C y C ++.
int new;
no es C / C ++, y tampoco lo esvector<int> foo;
.Del mismo modo, C89 / C99 es la intersección de estos dos lenguajes, donde ninguno
enum bool { false, true };
ofor(int i = 0;;)
está permitido.Y C ++ 11 / C ++ 14, etc.
Es posible escribir código que compila (y se ejecuta correctamente) en C ++ 11 y C ++ 14, aunque compilar en uno no implica que se compila en el otro. De hecho, mucha gente hace esto.
Y mucha gente escribe código que funciona en C y C ++.
Obviamente, cuanto mayor es la superposición, más sentido tiene; No espero ver ninguna pregunta sobre el código C / C ++ / Java.
Aunque "tiene sentido" hablar de un subconjunto común de estos lenguajes, muchas preguntas no tendrán respuestas en este subconjunto, por ejemplo, ¿Qué debería devolver main () en C y C ++?
Pero puede hablar sobre el código que funciona para múltiples especificaciones de idioma, ya sea que esas especificaciones estén diferenciadas por "versión" o "nombre de idioma" o de otra manera.
fuente
Esta es una especie de respuesta a la posición de que "este es un código para programadores que trabajan cerca del metal y está bien en un contexto de gestión" visto en algunas de las otras respuestas y comentarios.
Yo diría que incluso esa interpretación debe tomarse con cuidado.
Comenzando por lo menos a mediados de los 90, si quisieras que un programador de C ++ y alguien que se describiera como un programador de C aplicara, habrías tenido que preguntar cuánto saben sobre el diseño orientado a objetos, cuánta experiencia tienen con la depuración de un objeto contexto orientado y sobre su capacidad para usar bibliotecas de plantillas. Desea investigar exactamente esos problemas durante la entrevista y el proceso de contratación.
Por otro lado, ha pasado más de una década desde que los gurús de C ++ comenzaron a impulsar "C ++ moderno", lo que significa un énfasis en alejarse de los punteros desnudos a objetos de puntero más seguros y modismos basados en iteradores. Con la aparición de C ++ 11, ahora existe un soporte explícito para la programación de paradigmas múltiples y el impulso hacia el código que no muestra punteros es muy fuerte. Lo que eso significa es que si entrevistara a un programador de C ++ para un puesto en C hoy, estaría muy preocupado por comprobar qué tan familiarizada estaba esta persona con los punteros reales habilitados para disparar los pies.
No estoy en el negocio en estos días (incluso en la medida en que lo estaba cuando Stack Overflow estaba en su infancia), por lo que no me aventuraré a adivinar con qué frecuencia ninguno de los entrevistados imaginarios tendría las habilidades de cruce, pero Creo que, como se aplica con mayor frecuencia, los idiomas ahora son muy diferentes.
En resumen, "C / C ++" debería descartarse no solo en contextos técnicos sino también en la mayoría de los contextos comerciales.
fuente
La respuesta más simple a esta pregunta es que nunca debiste haber usado ese término. Es un término que no debería existir. No tiene sentido Cada programa es C o C ++.
C ++ 98 y 03 tampoco son remotamente C con Clases tampoco. Quien te enseñó esto no sabe una mierda y puedes olvidarlo. Esto nunca fue correcto.
fuente
Conceptualmente, no debería haber ninguna dificultad particular con el diseño de archivos fuente de C para que también puedan compilarse tal cual con C ++. De hecho, puede haber algunas ventajas significativas para hacer esto. Por ejemplo, al escribir código para un sistema embebido, a veces es útil poder probar el código en un entorno de PC alojado. Si el código se compila limpiamente como C ++, es posible tener una declaración como "MOTOR_ENABLE = 1;" escriba en un bit de E / S volátil en el sistema incorporado (compilado como C), pero active la lógica de emulación en la PC (compilando como C ++). Probablemente también sea posible diseñar un tipo C ++ en la PC que se comportaría de la misma manera que un uint16_t se comporta en sistemas embebidos más pequeños (de modo que, por ejemplo
u16 x=65533;
, un compilador tendría que considerar el valor dex*x
como nueve, en lugar de tener un reinado libre para hacer lo que quiera), aunque todavía ninguno de mis emuladores lo ha incluido [en parte porque los compiladores de C ++ que he usado no han hecho nada raro en tales casos].Desafortunadamente, los programadores de C y los programadores de C ++ tienen suficiente antipatía entre sí que los lenguajes, a lo largo de los años, han evolucionado de manera compatible. Si bien C89 intentó adaptar algunas de las características más útiles de C ++ (como los prototipos de función) parece haber surgido una actitud de que los programadores que desean cualquiera de las características de C ++ deberían usar C ++, ignorando el hecho de que hay muchas situaciones en las que Ser útil para poder usar algunas de las características de C ++ (por ejemplo, la capacidad de sobrecargar funciones con enlaces estáticos o en línea estáticos sin tener que aceptar los costos asociados con otras características que no se necesitan (por ejemplo, el cambio de nombre asociado con la exportación funciones sobrecargadas).
Si bien la intersección de C89 y C ++ 98 es un lenguaje viable, el superconjunto utilizable de versiones posteriores de C con versiones posteriores de C ++ probablemente se ha reducido en lugar de crecer (gracias a cosas como la Regla de alias estricto) y las tendencias favorecen una fisura creciente.
fuente
namespace
y declarar el segundo comoextern "C"
, luego use un compilador de C ++.extern "C"
o también hay otras complicaciones (por ejemplo, inicialización de objetos estáticos, etc.)? ¿Hay alguna forma en C ++ para hacerlo de modo quefoo(1234)
invoque unafoo_const(1234)
macro mientras quefoo(x)
[dondex
no hay una constante] invocará unafoo_var(x)
función? Hay muchas situaciones en código incrustado en las que puede tener sentido para una "función" gustaríaSET_PORT(port, state)
tener tres formas en base a si el puerto y el estado son tanto ...