2010-11-30 35 views
0

Je me demandais depuis un moment pourquoi l'initialisation de données en les transmettant à une fonction n'est pas permise malgré le fait que les constructeurs qui sont une sorte de fonction puissent être appelés à l'échelle globale, donc si nous avons quelque chose comme un tableau à portée mondiale, il ne peut pas être initialisé par une fonction, mais si elle était un objet d'une structure à portée mondiale, alors il pourrait être initialisé à l'aide d'un constructeur à la portée:Pourquoi l'initialisation de données à l'échelle globale en les transmettant à certaines fonctions n'est pas possible?

//global scope 

    char charArray[100];//can't be initialized using any function at global scope but in other scopes it could by being passed to some function 

    struct Test{ 
    public: 
     Test(){ 
     //initialization 
     } 
     char charArray[100]; 
    }; 
    Test obj();//now charArray can be initialized using constructor at global scope 
+0

Votre question est basée sur une prémisse incorrecte, et n'a donc aucun sens. 'charArray' * peut * être initialisé en le passant à une fonction dans la portée globale. – AnT

+0

@AndreyT_Si vous avez un exemple, puis afficher, sinon regarder la réponse de Mark B. – Pooria

Répondre

5

en fait, vous pouvez appeler des fonctions à portée mondiale.

int foo() 
{ 
    return 5; 
} 

int bar = foo(); 

C est la façon dont C a été conçu il y a des années que vous ne pouvez pas faire fonctionner des fonctions de façon autonome. Tout le code du programme commence à main. En général, moins vous dépendez de l'initialisation globale (évitez-la si possible), moins vous aurez à vous inquiéter des erreurs statiques bizarres et de tels problèmes surgissant de manière aléatoire.

Les tableaux sont un cas différent car vous ne pouvez jamais affecter le résultat d'un appel de fonction à un tableau - la seule façon de l'initialiser dans ce cas est dans un constructeur comme vous l'avez observé.

EDIT: approche un peu de mal à initialiser un tableau inspiré par un commentaire:

bool do_init(int a[50]) 
{ 
    // Do whatever to init the array here. 
    return true; 
} 

int array[50]; 
bool init_array = do_init(array); 

Cela ne fonctionne que depuis l'intérieur d'une unité de traduction de l'ordre de la création/l'initialisation de GLOBALS est garanti l'ordre dans lequel ils apparaissent dans le fichier.

+1

Je me demande si vous pouvez initialiser un tableau via un effet secondaire d'une fonction appelée de la manière que vous décrivez ... –

2

Les tableaux ne peuvent pas être directement initialisés avec le résultat d'un appel de fonction, car les tableaux ne peuvent pas être affectés. Toutefois, vous pouvez "initialiser" le tableau si vous conservez ces deux ensembles.

#include <cstdio> 
#include <cstring> 

bool init(char* arr) 
{ 
    strcpy(arr, "Hello"); 
    return true; 
} 

char arr[100]; 
bool dummy = init(arr); 

int main() 
{ 
    puts(arr); 
} 

Et puis, un tableau peut être enveloppé dans un objet.

#include <array> 
#include <cstdio> 

std::array<char, 100> init() 
{ 
    std::array<char, 100> arr = {'H', 'e', 'l', 'l', 'o', '\0'}; 
    return arr; 
} 

std::array<char, 100> arr = init(); 

int main() 
{ 
    puts(&*arr.begin()); 
} 
0

En C et C++, chaque valeur globale doit avoir sa taille et son type connus au moment de la compilation. La raison en est que ceux-ci finissent par être alloués dans une section du binaire lié. Si vous souhaitez que quelque chose soit à la fois global et dynamique, vous devez déclarer un global avec un type de pointeur ou un type contenant un pointeur, puis allouer rapidement les données dynamiques et mettre à jour le pointeur.

+0

Ce n'est pas un question de dynamisme du tout, pourquoi le pensez-vous? – Pooria

+0

La transmission d'une valeur à une fonction est dynamique, ce qui signifie simplement qu'elle se produit au moment de l'exécution. La taille de stockage ne peut pas être dynamique, ce qui explique pourquoi un tableau ne peut être affecté qu'à partir d'un littéral de compilation. – Tobu