2
votes

Quelle est la différence entre les variables externes en C et C ++?

b.c ne parvient pas à se compiler mais b.cpp peut être compilé. Je ne comprends pas tout à fait la différence d'extern entre C et C ++. Quelqu'un pourrait-il expliquer pourquoi b.c ne fonctionne pas mais b.cpp ? Merci.

$ cat b.c 

extern int b;
int a = b;
$ gcc -g -Wall -pedantic -c -o b.o b.c
b.c:4:9: error: initializer element is not a compile-time constant
int a = b;
        ^
1 error generated.
$ cat b.cpp 

extern int b;
int a = b;
$ g++ -g -Wall -pedantic -c -o b.o b.cpp
$ ls -g b.o 
-rw-r--r-- 1 staff 2640 Jan  5 10:22 b.o


1 commentaires

Si je me souviens bien, C ne prend pas en charge l'initialisation d'exécution comme celle d'une variable globale.


3 Réponses :


4
votes

Il ne s'agit pas de variables externes. En C, les variables avec stockage statique doivent avoir des initialiseurs constants. En C ++, ils peuvent en avoir presque tous. La différence est: les objets C ++ ont des constructeurs et l'objet peut être initialisé presque de n'importe quelle manière (par exemple par la méthode ou l'appel de fonction).

en C ++ ce type d'initialisation est possible:

#include <string.h>

volatile char s[] = "sdfsasdf";

size_t size = strlen((char *)s);


3 commentaires

Seuls les objets de type classe ont des constructeurs. Un size_t n'est pas une classe et n'a pas de constructeur. Le reste de ce que vous dites est vrai.


@LightnessRacesinOrbit oui c'était une simplification car la question OPs montre qu'il vient de commencer à apprendre le C, c'est bien sûr l'initialisation statique et la destruction en C ++. Mais il fait exactement la même chose


Mais ce n'est pas une "simplification", c'est une fausse déclaration;) Essayons d'éviter d'enseigner des mensonges aux nouveaux débutants dès le départ.



5
votes

Ce n'est pas un problème externe.

L'élément d'initialisation Error "est not constant "lors de la tentative d'initialisation de la variable avec const

En langage C, les objets avec une durée de stockage statique doivent être initialisés avec des expressions constantes ou avec des initialiseurs d'agrégats contenant des expressions constantes.


0 commentaires

6
votes

Il n'y a pas de différence significative entre les variables extern en C et C ++. Ce qui est différent, c'est la règle des initialiseurs valides. En C, l'initialiseur d'une variable avec une durée de stockage statique doit être une constante de temps de compilation . En C ++, il peut s'agir à peu près de n'importe quelle expression (y compris un appel de fonction compliqué).


0 commentaires