Devrais-je arrêter d'utiliser le terme C / C ++?


140

Je comprends que C et C ++ sont des langages différents, mais lors de mon apprentissage du C ++, on me disait toujours que C était un sous-ensemble de C ++ ou que C ++ était C avec des classes. Et cela était tout à fait vrai jusqu'à l'apparition de C ++ x0, C ++ 11 (ou du C ++ moderne en général). En fait (surtout lorsque vous travaillez sur des systèmes embarqués), il est très probable que le code soit écrit en C ++, mais avec de nombreuses parties écrites entièrement en langage C pur. Ici j'ai plusieurs questions:

  1. Devrais-je arrêter d'utiliser le terme C / C ++?
  2. Si la réponse à la question 1 est oui, comment pourrais-je appeler un programme qui utilise une combinaison de C et C ++?
  3. Étant donné que ces deux langues sont des langages "différents", il est probable qu'un compilateur C ++ cesse de prendre en charge le code écrit en langage C (car le c ++ moderne s'écarte de la mentalité C pour les éléments de base tels que les pointeurs, la gestion dynamique de la mémoire, etc.)
  4. Existe-t-il actuellement une collaboration entre les personnes qui établissent les normes du C / C ++ pour conserver la compatibilité
  5. Si # 4 est oui, une telle collaboration pourrait aboutir dans un proche avenir avec l'apparition du c ++ moderne (11/14/17)

Je sais qu'il y a déjà des questions similaires, mais je suis sûr que beaucoup de personnes partagent ces questions, donc je suis très intéressé d'obtenir de bonnes réponses, en particulier pour les points relatifs à la tendance C ++ dans un proche avenir.


35
Et c'était assez vrai jusqu'à l'apparition de C ++ x0, C ++ 11 Non, C89 n'est pas un sous-ensemble de C ++ 98.

35
Should I stop using the term C/C++. Oui. Ceci est utilisé uniquement par les recruteurs et les ressources humaines. Les ingénieurs utiliseront le terme Cou en C++tant que langues indépendantes. Si vous trouvez un ingénieur qui mélange le terme, évitez-le.
Martin York

8
@LokiAstari: vraiment? Je suppose que les développeurs SQLite sont des RH, car ils n’ont pas de postes à pourvoir. C'est une vue incroyablement restrictive (allez s'il vous plaît et retournez ma réponse comme d'autres l'ont fait dans votre cas).

4
@ Greyfade: Il est mauvais de supposer que n'importe qui, n'importe où, peut prétendre à une séquence de caractères couramment vue. "C / C ++" peut être le nom choisi pour une langue donnée, mais cela ne signifie pas que l'utilisation de "C / C ++" se réfère à cette langue, pas plus que si je copiais ce site Web et remplaçais "C / C ++" par "C ++ 1z" que toute discussion sur le projet de norme C ++ utiliserait soudainement une terminologie erronée. En termes simples, la chaîne "C / C ++" n'a jamais fait référence à ce langage de plaisanterie nommé "C / C ++" et ne le fera jamais.
Ben Voigt

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "Au sens mathématique strict, C n'est pas un sous-ensemble de C ++ ... Cependant, C ++ supporte toutes les techniques de programmation supportées par C ... Ce n'est pas inhabituel de pouvoir convertir en quelques heures des dizaines de milliers de lignes de C en style C ++. Ainsi, C ++ est autant un sur-ensemble d'ANSI C qu'un ANSI C est un sur-ensemble de K & R C et autant qu'un ISO super ensemble du C ++ tel qu’il existait en 1985. Le C bien écrit tend également à être un C ++ juridique. Par exemple, chaque exemple dans Kernighan & Ritchie: "Le langage de programmation C (2e édition)" est également un programme C ++. "
Ben

Réponses:


183

C n'a jamais été un sous-ensemble de C ++. L'exemple le plus évident de cela est int new;. C’est vrai depuis C89 et C ++ 98, et les langages n’ont fait que se distancer au fur et à mesure que de nouvelles normes sont apparues.

Devrais-je arrêter d'utiliser le terme C / C ++

Oui

Si la réponse à la question 1 est oui, comment pourrais-je appeler un programme qui utilise une combinaison de C et C ++?

Un fichier source est écrit dans une langue ou une autre. Un programme peut consister en un code provenant de plusieurs langues travaillant ensemble ou en un exécutable créé en liant différents objets compilés. Vous diriez que le programme a été écrit en C et C ++, "C / C ++" n’est pas un langage.

Étant donné que les deux sont des langages "différents", il est probable qu'à un moment donné, les compilateurs C ++ cessent de prendre en charge le code écrit en langage C

3) Ils ne l'ont jamais fait. char *a = malloc(10);. C et C ++ n’ont jamais été totalement compatibles depuis au moins aussi longtemps qu’ils respectaient les normes ISO (je ne connais pas tous les détails des jours pré-normalisés). Cliquez sur les liens ou reportez-vous ci-dessous à la recherche d'un fichier compatible avec C89 et supérieur, mais non valide sous aucune norme C ++.

4) autant que je sache, les groupes de travail se connaissent, mais les normes prennent les décisions qui leur conviennent le mieux.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

Je pense toujours qu'il vaut la peine de mentionner que C est un sous-ensemble d'Objective-C.


59
Objective-C a été spécifiquement conçu pour être un sur-ensemble strict de C, sans syntaxe en conflit et un système d'objet totalement orthogonal. Ceci est poussé à un tel point que vous pouvez réellement prendre la partie "Objective" de "Objective-C" et la fixer à d'autres langages, en créant par exemple Objective-MODULA-2. Et le plus célèbre, Objective-C ++ d’Apple, qui propose deux systèmes d’objets totalement orthogonaux, non interactifs et non intégrés.
Jörg W Mittag le

20
@masonwheeler si OP veut voir à quoi ressemble un sur-ensemble réel de C.
xhainingx

26
"Un fichier source est écrit dans une langue ou dans une autre." Dites-le à mon programme qui compile proprement en C99 standard et en C ++ 89. Aucune langue n'est un sous-ensemble de l'autre, mais il existe une intersection de leurs deux ensembles qui est largement ciblée. Voir Lua et al.
magnifique

28
@ munificent Je peux écrire du code C ++ qui peut aussi être utilisé javac, mais à quoi servirait-il?
xhainingx

22
@munificent Un exemple de programme pouvant être compilé en trois langues - C, / bin / sh et f77 - correspond à l'entrée applin.c de l'IOCCC 1986. Selon votre définition, l'étiquette a C/Fortran/shun sens maintenant ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd

108

Il doit y avoir une raison pour laquelle ces termes sont si souvent réunis. Bien que vous ne devriez pas dire à votre professeur de C que sa langue est un sous-ensemble du C ++, il y a une part de vérité ici. D'autres ont déjà exposé le point de vue de votre professeur. C'est très agréable (et illustré d'exemples, etc.). Mais nous ne vivons pas dans une tour d'ivoire ou un livre.

Votre grand patron se moque de la langue exacte que vous avez utilisée. S'il en sait un peu sur la programmation, dites-lui simplement que vous avez utilisé le C / C ++ et que le son sera: "J'ai utilisé un langage qui doit être compilé en code machine, avec des DLL et tout le reste compliqué". C'est la partie "communication externe".

Si vous créez une bibliothèque pouvant être interfacée à la fois par C et C ++, vous voudrez certainement l'appeler une bibliothèque C / C ++. Bien sûr, quelqu'un lèvera la main et vous demandera pourquoi vous n'appelez pas cela une bibliothèque C disposant d'un wrapper C ++, et de toute façon, le C ++ peut être lié à des bibliothèques C, de sorte que vous n'avez pas besoin de le mentionner du tout. Répondez simplement: "Oui, vous avez raison, il s’agit d’une bibliothèque C / C ++". C'est la partie "communication interne".

Si vous créez un analyseur lexical pour C ++, vous seriez surpris de voir à quel point il fonctionne avec C. Vous n'aurez peut-être même pas besoin de tout modifier. Ceci est le "si cela ressemble à un canard, etc." partie.

Etc.

La majorité des programmes C que j'ai vus se compilent (et fonctionnent) sans modification en code C ++. Ne laissez pas quelques exceptions ou programmeurs dogmatiques (même influents) tromper votre intuition. C et C ++ sont si proches et si souvent compatibles, et si souvent mélangés et appariés, que le terme C / C ++ est utilisé. Il est utilisé car il est utile de décrire ce type de situation où il importe peu de savoir si vous envisagez d'utiliser le C ou le C ++, tant que ce n'est pas Java ou PHP . Nous savons que c'est "faux", mais cela nous est égal, c'est plus utile que mal.

Cela peut être abusé, stupide, mais je ne suis pas sûr de l’avantage que vous obtiendrez en étant plus pédant que nécessaire et en refusant de communiquer dans des termes que les autres comprennent. Si vous vous sentez mal à l'aise dans une situation donnée, n'utilisez simplement pas le terme générique C / C ++, mais celui qui est pertinent en l'espèce (C ou C ++).

N'ayez pas peur de l'avenir. Nos systèmes d'exploitation sont écrits en C. Une grande partie de la production logicielle actuelle en C / C ++ se fait en C ++. Ce couple est là pour rester pendant un bon moment. Personne n'a intérêt à ce que l'un soit rendu plus incompatible avec l'autre (au contraire, en fait).

Pour être précis sur vos points:

1) ça dépend. Oui, lorsque cela peut semer la confusion, lorsque vous vous sentez mal à l'aise, ou simplement que c'est faux ou hors de contexte. Non quand vous pensez que c'est adéquat.

2) N / A

3) Je pense que non, mais je n'ai pas de boule de cristal.

4) aucune idée

5) Je ne pense pas, car rien ne va dans cette direction


7
Les commentaires ont été supprimés car ils devenaient bruyants.
ChrisF

3
Pourquoi cela a-t-il tant de votes positifs? C'est plein d'inexactitude et de fausses déclarations!
Zaibis

5
@Zaibis auriez-vous la gentillesse de préciser quelles affirmations sont fausses ou inexactes?
Numéro d'utilisateur

3
En suivant votre logique, C / C ++ / Objective-C / Fortran / Pascal devrait être une expression valide, mais cela semble idiot. Le problème avec le terme C / C ++ est qu'il peut signifier plusieurs choses, donc vous n'avez aucune garantie qu'il convergera le sens souhaité. Dans ma pratique, les gens le comprennent généralement comme "C est juste une ancienne version primitive de C ++" et c'est tout simplement faux.
martinkunev

4
Au-delà de la validité intrinsèque du terme, C/C++n’est pas clair, et donc inutile. Suivant vos exemples, un C/C++ librarypourrait signifier une bibliothèque C avec un wrapper C ++, ou une bibliothèque C ++ avec un wrapper C. Cela peut également signifier que la bibliothèque est composée de plusieurs modules, certains compilés à l'aide de C ++, d'autres à C, ce qui n'est pas clair du tout. Pour moi, dire qu'une bibliothèque est faite C and C++est beaucoup plus clair, ou C library with compatibility with C++est aussi beaucoup plus clair. Et ici l'ambiguïté n'est que de deux langues, imaginez utiliser cette "stratégie de communication" pour en savoir plus ...
gaborous

43

Aller à contre-courant, je dirais que cela dépend du contexte .

Le terme "C / C ++" n'est généralement pas approprié lorsque vous dites quelque chose comme "ceci est un programme C / C ++", mais cela a été approfondi dans d'autres réponses.

Cependant, il peut y avoir des contextes où C / C ++ peut être approprié.

  • Il existe différentes bibliothèques qui ont généralement une API C et C ++. Je suppose que ce n’est pas loin de la vérité si vous appelez une telle chose une bibliothèque C / C ++. Nous, les humains, aimons compresser les informations. Par conséquent, dire "opencv est une bibliothèque C / C ++" est court, clair et compréhensible, comparez cela à "opencv est une bibliothèque qui est livrée avec des en-têtes pour C et C ++".
  • Vous pouvez parler de la conception et de la syntaxe du langage. Du point de vue de la syntaxe de langage, vous pourriez dire qu’un langage a une syntaxe semblable à C / C ++.
  • Vous organisez un concours de codage et vous acceptez les deux solutions écrites en C et en C ++.
  • Vous embauchez un nouveau programmeur et la plupart des tâches seront en C ou C ++. Le programmeur doit donc connaître les deux langages. C'est courant dans les développements intégrés, où le C convient mieux à certains microcontrôleurs (généralement très petits) et le C ++ à d'autres. Dans ce cas, vous pourriez dire que vous recherchez un programmeur C / C ++.

10
Je vois que les positions contre le consensus général ici sur P.SO. (où vous devez upvoter tout ce qui ressemble à "agile / hype / comme The One And Unique Right Thing" et downvote le reste) sont aussi bienvenus que d'habitude. Les gars, la programmation n'est pas une religion et ce site Web n'est pas un livre sacré.

16
Le dernier point présente en fait un problème majeur: Vous cherchez (1) pour une personne qui gratifia soit C ou C ++, (2) une personne qui connaît à la fois C et C ++ ou (3) une personne qui est confus d'entendre ce sont différentes langues. N'aide pas cette troisième piscine à grandir.
5gon12eder

10
Le dernier point serait mieux exprimé par "programmeur expérimenté en C et C ++" si c'est ce que vous recherchez réellement. Une offre d'emploi intitulée "programmeur" qui, selon l'expérience, nécessitait les rubriques "C et C ++" ou "C ou C ++" n'est pas très différente de celle intitulée "programmeur" et répertorie "C / C ++" comme qualification nécessaire, mais beaucoup plus exact. Le type de personne que vous recherchez pour un tel travail pourrait très bien apprécier cette exactitude d'expression.
un CVn

10
En langage écrit, le '/' est généralement interprété comme une logique oret non comme une logique xor. Donc, c'est l'un ou les deux. Dans les offres d'emploi, vous connaissez C, C ++ ou les deux. Maintenant, j'ai l'impression que beaucoup de gens sont religieux à propos de ce terme. Un bon programmeur C maîtrisera parfaitement le langage C ++ indépendamment de la différence entre les deux langages. J'ai commencé à coder PHP puis je suis passé à Scala (deux langages complètement différents). Pourquoi un programmeur C ne pourrait-il pas lire le C ++ ou vice-versa? Le terme C / C ++ a un certain mérite s’il est utilisé dans le bon contexte.
ILikeTacos

4
Vous pouvez également utiliser C / C ++ pour décrire un programme destiné à fonctionner lorsqu'il est compilé en C ou C ++, ou en tant que programme comportant des composants C et C ++ distincts.
Immibis

30

En général, les utilisateurs de SO demandent à la personne qui pose la question de choisir un langage: C ou C ++. Pourquoi?

Il existe de nombreuses différences subtiles entre C et C ++. Par exemple, en C ++, une constvariable de portée globale a une liaison interne sauf si elle est déclarée extern, mais en C elle a une liaison externe sauf si elle est déclarée static. En disant "C / C ++", l'OP affirme que la réponse à sa question est la même en C et C ++, alors que ce n'est peut-être pas le cas. Cela complique inutilement la tâche des personnes susceptibles de répondre.

  • Parfois, nous pouvons remarquer que le code n'est pas valide dans l'une ou l'autre langue (par exemple, les conversions implicites de point void*à point ne sont pas valides en C ++). C'est énervant. Pourquoi dites-vous "C / C ++" quand vous avez un morceau de code valide en C mais pas en C ++? Aviez-vous l'intention de C, ou s'agit-il simplement d'une erreur de code destiné à être C ++?

  • Parfois, la réponse sera différente selon le langage (par exemple, des tableaux de longueur variable existent en C99 mais pas en C ++). Si nous ne savons pas de quelle langue vous parlez, nous devons soit deviner, soit écrire une réponse pour les deux quand une seule sera réellement utile, car vous savez quelle langue vous utilisez réellement; vous ne nous dites pas juste!

  • Parfois, la réponse est vraiment la même pour les deux langues, mais il est difficile d’en être sûr. Par exemple, je pense que C et C ++ ont les mêmes règles de conversion d'entiers, mais pour être vraiment, vraiment sûr, je dois lire les deux normes attentivement. Encore une fois, cela me fait faire deux fois plus de travail que nécessaire lorsque vous ne vous souciez probablement que d'une des langues.

Quoi qu'il en soit, pour répondre à vos autres questions:

  1. Oui.

  2. Si vous associez des codes C et C ++, il est acceptable d’utiliser les deux balises, mais veuillez spécifier la langue de chaque fichier.

  3. Il y a parfois des changements radicaux, mais ils sont rares et ont généralement un impact limité (sinon, ils ne sont pas approuvés). Par exemple, autoen C ++ 11.

  4. Je ne pense pas qu'ils collaborent directement, mais ils sont attentifs aux évolutions dans l'autre langue et évitent d'introduire des modifications rendant la compatibilité plus difficile.

Et si vous voulez vraiment connaître les deux langues, c'est très bien, et vous pouvez le dire dans votre question. Quand vous dites "C / C ++", je ne suis vraiment pas sûr de ce que vous voulez dire, et on dirait vraiment que vous faites une supposition sur les deux langages.


7
Je sais qu'il y a des gens qui écrivent du code à l'intersection de C et C ++ et utilisent un compilateur C ++ pour la vérification de type, mais un compilateur C pour la génération de code. Je ne sais pas si cela a du sens ou non. Cependant, il est un sujet qui revient tous les deux ans sur le noyau Linux Mailinglist, quand quelqu'un soumet un patch pour renommer le (très important dans le pilote orienté objet unifié de noyau Linux Model) struct classà quelque chose comme struct klassprécisément pour cette raison, et est alors invariablement abattu par Linus.
Jörg W Mittag

3
@ JörgWMittag: Je n'ai jamais rencontré quelqu'un qui utilisait "C / C ++" comme un raccourci pour "le sous-ensemble commun de C et C ++" et qui savait également de quoi il parlait. Les personnes qui travaillent intentionnellement dans le sous-ensemble commun ont tendance à rendre cela explicite en n'abréquant pas.
Bart van Ingen Schenau

2
C'est une bonne réponse en particulier à propos de l'utilisation du C / C ++ dans les questions sur Stack Exchange , plutôt qu'en général.
Immibis

@BartvanIngenSchenau Combien de membres de comités std avez-vous rencontrés?
Curiousguy

18

On m'a toujours dit que C est un sous-ensemble de C ++ ou que C ++ est C avec des classes. Et c’était assez vrai jusqu’à l’apparition de C ++ x0, C ++ 11 (ou du C ++ moderne en général).

C n'a jamais été un sous-ensemble de C ++. Par exemple, C89 n'est pas un sous-ensemble de C ++ 98.

Quelques exemples:

  • la forme liste d'identifiants C89 pour la déclaration de paramètres de fonction n'est pas prise en charge en C ++
  • C89 et C ++ 98 ont des types différents pour les constantes de caractères
  • C89 et C ++ 98 ont des types différents pour les littéraux de chaîne
  • les opérateurs logiques produisent différents types en C89 et C ++ 98 ( intvs bool)
  1. Devrais-je arrêter d'utiliser le terme C / C ++?

Oui.

  1. Si la réponse à la question 1 est oui, comment pourrais-je appeler un programme qui utilise une combinaison de C et C ++?

Un programme est soit C, soit C ++ (si même un programme très basique peut être compilé avec un compilateur C ou C ++). Quel compilateur utilisez-vous pour le compiler? Cela devrait répondre à votre question. Harbison & Steele ont inventé le terme Clean C pour désigner un sous-ensemble commun de C et C ++, mais je pense que c'était une mauvaise idée.

EDIT : Cependant, j’admets que techniquement, vous pouvez lier des fichiers d’objets C et C ++ dans un seul programme, mais OTH permet de mélanger de nombreux langages dans un seul programme, par exemple Java et C ++. Je pense que l'utilisation du terme programme C / C ++ ne fait qu'ajouter à la confusion qu'il est écrit dans un seul langage appelé C / C ++.

  1. Étant donné que ces deux langues sont des langages "différents", il est probable qu'un compilateur C ++ cesse de prendre en charge le code écrit en langage C (car le c ++ moderne s'écarte de la mentalité C pour les éléments de base tels que les pointeurs, la gestion dynamique de la mémoire, etc.)

Il existe de nombreuses fonctionnalités (exemple: tableau de longueur variable, membre de tableau flexible,, _Generic...) de C99 ou C11 qui ne sont prises en charge par aucune version C ++.


Programmes multi-langues: un programme utilisant largement JNI pourrait être appelé programme C / Java. Le fait que deux langues soient utilisées ensemble ne signifie pas qu'elles sont compilées ensemble.
Immibis

1
stroustrup.com/bs_faq.html#C-is-subset "Au sens mathématique strict, C n'est pas un sous-ensemble de C ++ ... Cependant, C ++ supporte toutes les techniques de programmation supportées par C ... Il n'est pas rare d'être capable de convertir en quelques heures des dizaines de milliers de lignes de C ++ de style C en C. Ainsi, C ++ est autant un surensemble d’ANSI C que ANSI C est un surensemble de K & R C et autant que ISO C ++ est un surensemble de C ++. tel qu'il existait en 1985. Bien écrit, le C est généralement C ++ légal. Par exemple, chaque exemple dans Kernighan & Ritchie: "Le langage de programmation C (2e édition)" est également un programme C ++. "
Ben

@Ben le premier programme (hello world) dans "Le langage de programmation C (2e édition)" omet le type de retour de main qui n'est pas valide en C ++.
ouah

1
@ouah, il semblerait que le professeur Stroustrup en ait manqué un alors :-) Notez que ce n'est pas autorisé dans C11 non plus :-) Je suis presque sûr que cela a été autorisé dans les versions précédentes de C ++.
Ben

4
@ouah, ce n'est pas la première version de C ++. Le livre date de 1988 et à cette époque, aucune langue n'était une norme ISO. La version actuelle de C ++ à cette époque était le livre de Bjarne Stroustrup de 1985.
Ben

17

Certains programmes sont écrits dans un mélange de C et C ++

Ceci est juste une réalité de la vie. Vous pouvez compiler des fichiers objet à partir de C et C ++ et les lier entre eux. On peut raisonnablement appeler le résultat "un programme C / C ++".

Mais ce n'est que le programme dans son ensemble. Qu'en est-il des unités de compilation individuelles?

Il existe un sous-ensemble de C qui est également un sous-ensemble de C ++

Un programme (ou une unité de compilation) écrit dans ce sous-ensemble compilera et se comportera de la même manière sous les compilateurs C et C ++ conformes. Un tel programme ou fichier peut à juste titre être appelé "programme C / C ++" ou "fichier C / C ++".

Un programme partiel tel qu'un fichier d'en-tête peut également être utilisé dans les programmes C et C ++. De tels fichiers d'en-tête peuvent à juste titre être appelés en-têtes C / C ++.

Citant le professeur Bjarne Stroustrup:

C est un sous-ensemble de C ++?

Au sens mathématique strict, C n'est pas un sous-ensemble de C ++. Il existe des programmes qui valent le C mais pas le C ++ et même quelques façons d’écrire du code qui a une signification différente en C et C ++. Cependant, C ++ prend en charge toutes les techniques de programmation prises en charge par C. Chaque programme C peut être écrit essentiellement de la même manière en C ++ avec la même efficacité d'exécution et d'espace. Il n'est pas rare de pouvoir convertir en quelques heures des dizaines de milliers de lignes de C ANSI en C ++ de style C. Ainsi, C ++ est autant un sur-ensemble d'ANSI C que ANSI C est un sur-ensemble de K & R C et autant qu'ISO C ++ est un sur-ensemble de C ++ tel qu'il existait en 1985.

Bien écrit, le C a également tendance à être légal. Par exemple, chaque exemple dans Kernighan & Ritchie: "Le langage de programmation C (2e édition)" est également un programme C ++.

Alors oui, il existe une chose telle que C / C ++. C'est tout ce qui est à la fois valide C et valide C ++.

Le pré-processeur C fait partie du langage C. Le pré-processeur C ++ fait partie du langage C ++

Vous pouvez écrire une unité de compilation qui compilera sous C ou C ++ et sera différente . Par exemple, il peut avoir des fonctionnalités de base compilées en C mais tirer parti d’une bibliothèque C ++ s’il est compilé en C ++.

Si le programme est essentiellement identique, mais avec des fonctionnalités supplémentaires, il n’est pas tout à fait faux de dire que c’est le même programme. C'est pareil, mais aussi différent.

La plupart des programmeurs C peuvent faire au moins un peu de C ++ et vice-versa

Il n'est pas déraisonnable d'appeler une telle personne un programmeur C / C ++. Oui, ils se spécialisent probablement dans un domaine, mais y a-t-il quelqu'un qui est un programmeur compétent en C ou C ++ qui ne peut littéralement faire aucune autre langue? D'une certaine manière, ne sont-ils pas tous des programmeurs C / C ++?

Il n'y a rien de mal à dire "C / C ++". Ce qui compte, c'est d'être compris

La langue anglaise n'est pas un outil pour exprimer des syllogismes . Vous pouvez utiliser l'anglais pour la logique, mais seulement avec beaucoup d'effort.

En effet, les mots n’ont pas naturellement une signification exacte, mais plutôt un nuage vague de dénotations et de connotations. Ce qui compte, c’est que les gens comprennent ce que vous dites.


5
@ BЈовић Ils ne sont pas d'accord avec vous sur l'acceptabilité d'un petit bout de terminologie, vous concluez donc qu'ils ne comprennent pas la différence et sont incompétents. C'est une chose assez déraisonnable à dire.
Ben

4
@ el.pescado Oui. Vous constaterez que les gens se réfèrent en fait à PHP / JavaScript. Pourquoi pas? Le but est d'être compris, pas de jouer à des jeux avec des mots.
Ben

10
@ BЈовић Vous n'avez aucun sens. Ils ne sont pas "complètement différents". Le langage C ++ est un langage beaucoup plus large que le langage C, mais il contient presque tout le langage C qu'il contient. Il existe des incompatibilités qui empêchent le C ++ d'être un sur-ensemble approprié, mais elles sont petites. Comme des mots réservés supplémentaires, quelques transtypages supplémentaires sont nécessaires, mais c'est à peu près tout. C'est presque un vrai sur-ensemble, mais pas tout à fait.
Ben

7
@ BЈовић Peut-être que vous n'avez pas compris ce que j'ai écrit. Pourquoi ne pas regarder ici pour voir comment, dans tous les cas, il est possible d’adapter un programme C pour qu’il soit également compilé en C ++. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ BЈовић Si vous êtes un pédant pour la terminologie, sachez que C n'est pas " fonctionnel ", mais " procédural " - une différence que vous voudrez peut-être comprendre avant de lancer des accusations d'incompétence chez d'autres.
RM

15
  1. Devrais-je arrêter d'utiliser le terme C / C ++?

Absolument. On ne voit pas clairement ce que cette construction est censée exprimer, sauf peut-être une confusion sur ce que sont C et C ++ au nom de la personne qui utilise le terme.

Puisque cette confusion est une source courante de frustration, beaucoup de gens sont devenus très émus à son sujet et la simple apparence de ce terme sera une raison suffisante pour qu’ils deviennent négatifs à propos de votre contribution. Cela peut sembler idiot, mais cela semble être ce que nous avons.

Je recommande que, au lieu de parler de “C / C ++”, vous utilisiez un terme qui précise ce que vous voulez dire.

  • Si vous parlez de quelque chose en C qui pourrait ou non être aussi vrai pour C ++, disons simplement C .

    Exemple: comment maindéclarer la fonction en C?

    Au début, il pourrait sembler que la réponse pour C ++ soit la même: int main()ou int main(int, char**). Mais au fil de la discussion, il pourrait être pertinent de souligner qu'en C ++, la fonction doit être déclarée au niveau global, ce qui n'a pas de sens en C, car elle n'a pas de namespaces. D'autre part, C permet d'appeler de mainmanière récursive , contrairement à C ++. En C ++, il y a une implicite return 0;si vous "tombez" mainmais en C, l' returninstruction est requise sur n'importe quel chemin. La liste est longue et rend la discussion beaucoup plus simple si vous précisez clairement le langage à discuter.

  • Si vous parlez de quelque chose en C ++ qui pourrait ou non être vrai pour C, dites simplement C ++ .

    Exemple: un malloc()tableau ed de ints sera-t-il initialement entièrement composé de zéros en C ++?

    La réponse courte pour C se trouve être la même: non. Mais au fur et à mesure que la réponse se poursuit, il pourrait être intéressant de souligner qu'en C, callocserait une bonne alternative, alors qu'en C ++, utiliser un std::vector<int>aurait pu être un meilleur choix en premier lieu.

  • Si vous souhaitez souligner une similarité entre C et C ++, dites C et C ++ .

    Exemple: En C et C ++, l' implémentation de sizeofan intest définie et peut varier entre les compilateurs et les architectures.

    Ici, nous voulons souligner que C et C ++ se comportent de la même manière. Nous parlons explicitement des deux langues.

En fait, je recommande que vous soyez encore plus précis et que vous ne parliez pas seulement de “C” ou de “C ++”, mais de la version précise. Les deux langues évoluent et une déclaration directe telle que

C ++ prend en charge /* … */et // …commente alors que C ne prend en charge que le /* … */style.

n'est ni juste ni faux.

  1. Si la réponse à la question 1 est oui, comment pourrais-je appeler un programme qui utilise une combinaison de C et C ++?

Comme les langages se chevauchent, chaque programme C contiendra des parties qui pourraient ressembler à C ++ et vice versa. Néanmoins, les auteurs auront probablement opté pour un compilateur C ou C ++. Ainsi, dites «le programme est écrit en C » s’il est compilé avec un compilateur C et «le programme est écrit en C ++ » s’ils utilisent un compilateur C ++, même s’ils risquent de refuser l’utilisation de fonctionnalités C ++ modernes. Certaines personnes se réfèrent à ce code C ++ en tant que C ++ . L'absence de surcharge, les exceptions, le polymorphisme, les modèles et les flux d'E / S constituent les caractéristiques communes de ce code.

Si, au contraire, certains fichiers sont écrits en C et compilé avec un compilateur C et quelques autres fichiers sont écrits en C ++ et compilé avec un compilateur C ++, puis les fichiers objets liés ensemble, je dirais que « le programme est écrit dans un mélange de C et C ++ ”comme vous l’avez déjà fait.

Cependant, si, au lieu de cela, les auteurs prenaient grand soin d'écrire chaque fichier de manière à ce qu'il puisse être compilé avec un compilateur C ou C ++ et que le programme résultant fasse la même chose, vous pouvez dire que «le programme est écrit dans un sous-ensemble commun de C et C ++ ».

Ce dernier cas est souvent le cas pour les fichiers d’en-tête qui devraient être partagés entre le code C et C ++. L'écriture d'un tel code n'est pas facile, d'ailleurs. Si vous voulez plus souligner que seules les constructions ont été utilisés qui sont valides en C et C ++ et sont largement pris en charge par différents fournisseurs de compilateur, le terme d' un portable sous - ensemble commun de C et C ++ peut être utilisé pour souligner.

  1. Étant donné que les deux sont des langages «différents», est-il probable qu'un compilateur C ++ cesse de prendre en charge le code écrit en langage C (puisque le C ++ moderne s'écarte de la mentalité C pour les éléments de base tels que les pointeurs, la gestion de mémoire dynamique, etc.)?

Je ne suis pas sûr de comprendre cette question. Comme C et C ++ sont des langages différents, vous ne pouvez pas vous attendre à ce qu'un compilateur accepte un programme écrit pour l'autre. Cependant, les statisticiens sont souvent conçus de façon modulaire et si un compilateur C ++ a un front-end , les chances sont bonnes , il disposera également d'un frontal C. (Vous choisirez ensuite laquelle de vos choix via un commutateur de ligne de commande ou un moyen similaire.) Tant que les deux langues seront largement utilisées, il semble très peu probable que cela change. Je pense que votre remarque sur le «C ++ moderne» est essentiellement une question de bonnes normes de codage et de la bibliothèque standard. Du point de vue du compilateur , l'évolution des deux langues est plutôt convergente que divergente.

  1. Existe-t-il actuellement une collaboration entre les personnes qui établissent les normes du C / C ++ pour conserver la compatibilité?

Oui. Le modèle de mémoire et la bibliothèque d'opérations atomiques introduits dans C ++ 11 et C11 en sont un bon exemple. Il semble que les concepteurs des deux langues se rendent compte que la compatibilité est importante et travaillent à l’améliorer. Personnellement, j'aimerais que la collaboration soit plus intense et que les deux groupes de travail de l'ISO aient peut-être même adhéré, mais mes souhaits ne sont pas importants.

Bjarne Stroustrup parle des différences et des points communs entre les différentes versions de C et C ++ dans le § 44.3 de la 4ème édition du Langage de programmation C ++ qui, ironiquement, s'intitule «Compatibilité C / C ++». L'utilisation de ce terme pourrait en fait être appropriée dans ce cas car son sens est clair.

  1. Si # 4 est oui, une telle collaboration pourrait aboutir dans un proche avenir avec l'apparition du C ++ moderne (11/14/17)

Comme discuté ci-dessus, cela s'est produit dans C ++ 11 et on s'attend à ce qu'il se reproduise.


Comment cela ne peut-il être ni juste ni faux?
JDługosz

4
Il n’a pas de valeur de vérité bien définie, contrairement à l’affirmation selon laquelle «les produits écologiques sont chers». Pour une combinaison particulière de versions de C et de C ++, c'est vrai, pour d'autres, c'est faux.
5gon12eder

5

C / C ++ est l'intersection de C et C ++.

int new;n'est pas C / C ++, et n'est pas non plus vector<int> foo;.

De même, C89 / C99 est l'intersection de ces deux langues, où ni l'une enum bool { false, true };ni l'autre for(int i = 0;;)n'est autorisée.

Et C ++ 11 / C ++ 14, etc.

Il est possible d'écrire du code qui compile (et s'exécute correctement) sous C ++ 11 et C ++ 14, même si compiler sous l'un n'implique pas qu'il compile sous l'autre. En fait, beaucoup de gens le font.

Et beaucoup de gens écrivent du code qui fonctionne en C et C ++.

Évidemment, plus le chevauchement est important, plus cela a de sens; Je ne m'attends pas à voir des questions sur le code C / C ++ / Java.


Bien qu'il soit "logique" de parler d'un sous-ensemble commun de ces langages, de nombreuses questions n'auront pas de réponse dans ce sous-ensemble, par exemple Qu'est-ce que main () devrait renvoyer en C et C ++?

Mais vous pouvez parler d'un code qui fonctionne pour plusieurs spécifications de langage, que ces spécifications soient différenciées par "version", "nom de langage" ou autrement.


3

Ceci est une sorte de réponse à la position selon laquelle "ceci est un code pour les programmeurs qui travaillent près du métal et qui est OK dans un contexte de gestion", comme indiqué dans certaines des autres réponses et commentaires.


Je dirais que même cette interprétation doit être prise avec précaution.

À partir du milieu des années 90 au moins, si vous vouliez un programmeur C ++ et que quelqu'un se décrivant comme un programmeur C appliqué, vous auriez dû demander à quel point ils connaissaient la conception orientée objet, quelle expérience ils avaient du débogage dans un objet. contexte orienté, et sur leur capacité à utiliser les bibliothèques de modèles. Vous voudriez sonder exactement ces problèmes lors de l'entretien et du processus d'embauche.

D'un autre côté, cela fait maintenant plus de 10 ans que les gourous du C ++ ont commencé à utiliser le "C ++ moderne", ce qui signifie qu'il est plus important de passer des indicateurs nus aux objets pointeurs plus sûrs et aux idiomes basés sur des itérateurs. Avec l’émergence de C ++ 11, il existe désormais un support explicite pour la programmation multi-paradigmes et la poussée vers le code qui n’affiche aucun pointeur nu est très forte. Ce que cela signifie, c'est que si j'interviewais aujourd'hui un programmeur C ++ pour un poste en C, je m'inquiéterais beaucoup de vérifier à quel point cette personne était familière avec les véritables pointeurs activés pour le tir à pied.

Je ne suis plus dans le métier ces temps-ci (même dans la mesure où je l'étais quand Stack Overflow en était à ses balbutiements), je ne vais donc pas tenter de deviner à quelle fréquence l'une ou l'autre des personnes interrogées imaginaires n'aurait pas les compétences croisées, mais Je pense que, comme le plus souvent, les langues sont très différentes.

En bref, "C / C ++" devrait être supprimé non seulement dans des contextes techniques, mais également dans la plupart des contextes professionnels.


Un bon moyen de souligner que l’ambiguïté de savoir si cela signifie "C ou C ++, qui sait", "C et C ++, liés", "C et C ++, l’intersection" ou "C ou C ++, qui compte" est de moins en moins justifiable, même dans les cas où on pourrait s'en tirer.
Déduplicateur

2

La réponse la plus simple à cette question est que vous n'auriez jamais dû utiliser ce terme. C'est un terme qui ne devrait pas exister. Cela n'a pas de sens. Chaque programme est soit C, soit C ++.

Et c’était assez vrai jusqu’à l’apparition de C ++ x0, C ++ 11 (ou du C ++ moderne en général).

C ++ 98 et 03 ne sont même pas à distance avec les classes. Celui qui t'a appris ça ne connait pas la merde et tu peux les oublier. Cela n'a jamais été correct.


Ce n'est pas tout à fait vrai. À une époque, une page décrivait une spécification de langage proposée pour un langage appelé "C / C ++", qui spécifiait entre autres la (quasi) absence d'un système de types. Malheureusement, la page a depuis été supprimée et le site qui l'a hébergée a mis en place un fichier robots.txt qui a effacé la copie archivée de archive.org.
Greyfade

1
Aha, j'ai trouvé une copie sur archive.is: Reason , Syntax and Semantics .
Greyfade

5
"Chaque programme est en C ou en C ++." Je ne suis pas d'accord. Il est assez courant de prendre un programme C et de le porter en C ++, un fichier à la fois (en modifiant une option du compilateur pour ce fichier). Certains fichiers peuvent ne jamais être portés et rester C pour toujours. Un tel programme est écrit en C et C ++
nikie

Pas vraiment. Ce programme est composé de sous-programmes, chacun étant C ou C ++. Chaque TU, qui représente l'ensemble du programme pour le compilateur, est compilée en C ou C ++.
DeadMG

3
Ce n'est pas le cas que "Chaque programme est en C ou C ++". Le professeur Bjarne Stroustrup a déclaré: 'C bien écrit tend également à être légal C ++. Par exemple, chaque exemple dans Kernighan & Ritchie: "Le langage de programmation C (2e édition)" est également un programme C ++. ' stroustrup.com/bs_faq.html#C-is-subset
Ben

1

Conceptuellement, la conception de fichiers source C ne devrait présenter aucune difficulté particulière, de sorte qu'ils puissent également être compilés tels quels avec C ++. Cela peut en effet présenter des avantages importants. Par exemple, lors de l'écriture de code pour un système intégré, il est parfois utile de pouvoir tester le code sur un environnement PC hébergé. Si le code se compile proprement en C ++, il est possible d'avoir une instruction du type "MOTOR_ENABLE = 1;" écrire sur un bit d'E / S volatile sur le système intégré (compilé en C), mais déclencher une logique d'émulation sur le PC (compilation en C ++). Il serait aussi probablement possible de concevoir un type C ++ sur le PC qui se comporterait comme un uint16_t sur des systèmes embarqués plus petits (de sorte que, par exemple u16 x=65533;, un compilateur devrait considérer la valeur dex*xcomme neuf, plutôt que de pouvoir faire tout ce qu'il veut), bien qu'aucun de mes émulateurs ne l'ait encore inclus [en partie parce que les compilateurs C ++ que j'ai utilisés n'ont rien fait de farfelu dans de tels cas].

Malheureusement, les programmeurs C et les programmeurs C ++ ont une antipathie suffisante pour que les langages aient évolué au fil des ans de manière compatible. Tandis que C89 tentait d’adapter certaines des fonctionnalités les plus utiles du C ++ (telles que les prototypes de fonctions), il semble que les programmeurs souhaitant utiliser l’une des fonctionnalités du C ++ utilisent le C ++, ignorant le fait qu’il existe de nombreuses situations être utile pour pouvoir utiliser certaines des fonctionnalités de C ++ (par exemple, la capacité de surcharger des fonctions avec une liaison statique ou inline statique sans devoir accepter les coûts associés à d'autres fonctionnalités dont on n'a pas besoin (par exemple la gestion des noms associée à l'exportation fonctions surchargées).

Bien que l'intersection de C89 et de C ++ 98 soit un langage exploitable, le sur-ensemble utilisable des versions ultérieures de C avec les versions ultérieures de C ++ s'est probablement rétréci plutôt que développé (grâce à des éléments tels que la règle d'aliasing stricte) et les tendances favorisent une tendance constante. fissure croissante.


1
Qu'est-ce que "C ++ 95"? Un rapport technique?
Ben Voigt

1
Si vous souhaitez surcharger vos fonctions internes mais ne modifier aucun nom pour vos fonctions externes, vous pouvez placer le premier dans un fichier anonyme namespaceet déclarer le dernier comme extern "C", utilisez ensuite un compilateur C ++.
5gon12eder

@ BenVoigt: Mea Culpa. J'aurais dû le regarder. La version C ++ avant C99. Lorsque C89 est sorti, il a essayé de rendre le C plus semblable au C ++, mais C99 a ajouté un bon nombre de fonctionnalités qui n’intéressaient absolument pas C ++ (par exemple, des tableaux de longueur variable). Je ne programme pas beaucoup en C ++, mais je pense qu’un peu plus de fonctionnalités C ++ aideraient C plus que les caractéristiques divergentes ne l’aient aidé.
Supercat

@ 5gon12eder: Je n'ai jamais essayé de lier du code C ++ dans un projet C. Est-ce vraiment aussi simple que de tout avoir soit statique / en ligne ou extern "C"qu’il ya aussi d’autres complications (par exemple, l’initialisation d’objets statiques, etc.)? Existe-t-il un moyen en C ++ d’ foo(1234)invoquer une foo_const(1234)macro alors que foo(x)[où xn’est pas une constante] invoquera une foo_var(x)fonction? Il existe de nombreuses situations dans le code incorporé où il peut être judicieux de créer une "fonction", comme SET_PORT(port, state)avoir trois formes, selon que le port et l'état sont ...
Supercat

... constantes à la compilation, le port est constant mais l'état ne l'est pas, ou ni le port ni l'état ne sont des constantes. Existe-t-il un moyen de le faire proprement en utilisant des modèles ou un autre mécanisme C ++ standard, ou est-ce uniquement possible sur des compilateurs dotés d'extensions gcc?
Supercat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.