689 votes

Pouvez code qui est valable en C et C++ produire un comportement différent lors de la compilation dans chaque langue?

Le C et le C++ ont de nombreuses différences, et pas toutes valides code C est valable de code C++.
(Par "valide", je veux dire le code standard avec comportement défini, c'est à dire pas spécifique à l'implémentation/indéfini/etc.)

Est-il un scénario dans lequel un morceau de code valide en C et C++ serait de produire différentes comportement lorsqu'il est compilé avec un compilateur standard dans chaque langue?

Pour en faire un raisonnable/comparaison utile (je suis en train d'apprendre quelque chose de pratique, de ne pas essayer de trouver des lacunes évidentes dans la question), supposons:

  • Rien de préprocesseur (ce qui signifie pas de hacks avec #ifdef __cplusplus, pragmas, etc.)
  • Rien définis par l'implémentation est la même dans les deux langues (par exemple numérique des limites, etc.)
  • Nous comparons raisonnablement les versions les plus récentes de chaque norme (par exemple dire, C++98 et C90 ou plus tard)
    Si les versions de la matière, alors s'il vous plaît mentionner les versions de chacun de produire des comportements différents.

469voto

Seth Carnegie Points 45196

Voici un exemple qui prend avantage de la différence entre les appels de fonction et objet de déclarations en C et C++, ainsi que le fait que le C permet l'appel de fonctions non déclarées:

#include <stdio.h>

struct f { };

int main() {
    f();
}

int f() {
    return printf("hello");
}

En C++, cette impression sera rien, car temporaire f est créée et détruite, mais en C, il permet d'imprimer hello parce que les fonctions peuvent être appelées sans avoir été déclarée.

Dans le cas où vous poseriez la question sur le nom de l' f utilisé deux fois, le C et le C++ normes permet explicitement, et de mettre un objet que vous avez à dire struct f de lever l'ambiguïté, si vous voulez la structure, ou de laisser tomber struct si vous souhaitez que la fonction.

441voto

Jerry Coffin Points 237758

Pour le C++ vs C90, il y a au moins un moyen d'obtenir un comportement différent qui n'est pas définie par l'implémentation. C90 n'a pas une seule ligne de commentaires. Avec un peu de soin, on peut l'utiliser pour créer une expression entièrement avec des résultats différents en C90 et en C++.

int a = 10 //* comment */ 2 
        + 3;

En C++, tout de l' // à la fin de la ligne est un commentaire, pour que cela fonctionne:

int a = 10 + 3;

Depuis C90 n'a pas une seule ligne de commentaires, seulement l' /* comment */ est un commentaire. La première / et de la 2 sont les deux parties de l'initialisation, il vient:

int a = 10 / 2 + 3;

Donc, un bon compilateur C++ donnera à 13, mais un bon compilateur C 8. Bien sûr, j'ai juste pris un nombre arbitraire ici -- vous pouvez utiliser d'autres nombres que vous voyez l'ajustement.

408voto

Alexey Frunze Points 37651

Le suivant, valable en C et C++, va (probablement) résultat de différentes valeurs en i en C et C++:

int i = sizeof('a');

Voir la Taille de caractère ('a') en C/C++ pour une explication de la différence.

Mise à JOUR: un Autre de cet article:

#include <stdio.h>

int  sz = 80;

int main(void)
{
    struct sz { char c; };

    int val = sizeof(sz);      // sizeof(int) in C,
                               // sizeof(struct sz) in C++
    printf("%d\n", val);
    return 0;
}

184voto

detunized Points 8559

C90 vs C++11 (int vs double):

#include <stdio.h>

int main()
{
  auto j = 1.5;
  printf("%d", (int)sizeof(j));
  return 0;
}

Dans C auto signifie que la variable locale. En C90 c'est ok pour omettre la variable ou de la fonction type. La valeur par défaut est int. En C++11 auto signifie quelque chose de complètement différent, il indique au compilateur de déduire le type de la variable de la valeur utilisée pour l'initialiser.

124voto

godlygeek Points 781

Un autre exemple que je n'ai pas vu encore mentionné, celui-ci mettant en évidence un préprocesseur différence:

#include <stdio.h>
int main()
{
#if true
    printf("true!\n");
#else
    printf("false!\n");
#endif
    return 0;
}

Cette affiche "false" dans le C et le "vrai" en C++ En C, tout undefined macro renvoie la valeur 0. En C++, il y a 1 exception: les "vrais" évalue à 1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X