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
3 Réponses :
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);
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.
Ce n'est pas un problème externe.
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.
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é).
Si je me souviens bien, C ne prend pas en charge l'initialisation d'exécution comme celle d'une variable globale.