2009-08-20 8 views
2

Quelqu'un peut-il expliquer (ce qui pourrait être mon perçu) la disparité des erreurs dans le code suivant? Essentiellement, pourquoi "//OK" et "// erreur" sont-ils corrects?C++ Expression constante et limites de tableau

(compilateur est i686-pomme-darwin9-g ++ - 4.0.1 (GCC) 4.0.1 (Apple Inc. construire 5490))

#include <cmath> 
#include <iosfwd> 

template <typename T> 
class TT{ 
    char _c[sizeof(T) + static_cast<size_t>(::ceil(sizeof(T) * 0.001)) + 1]; // error: array bound is not an integer constant 
    //char _c[sizeof(T) + static_cast<size_t>(sizeof(T) * 0.001) + 1]; // OK 
    T _t; 
}; 

class IS{ 
    unsigned char* _u; 
    double _d; 
}; 

char s[static_cast<size_t>(::ceil(sizeof(TT<IS>) * 10.0))]; // error: array bound is not an integer constant 

int main(int argc, char** argv){ 
    char a[static_cast<size_t>(10.0)]; // OK 
    char b[static_cast<size_t>(::ceil(sizeof(double) * 10.0))]; // OK 

    TT<int> it; 
    char c[static_cast<size_t>(::ceil(sizeof(TT<int>) * 10.0))]; // OK 

    TT<IS> is; 
    char d[static_cast<size_t>(::ceil(sizeof(TT<IS>) * 10.0))]; // OK 

    return 0; 
} 

Comme une note de côté, je suis conscient de C + + 0x: expression constante généralisée.

Répondre

5

Le problème réside dans l'endroit où les tableaux sont déclarés.

Vous pouvez déclarer un tableau de taille non constante au niveau du fichier, car le compilateur doit savoir au moment de la compilation le montant à allouer et dans votre cas cela nécessiterait un appel de fonction. Lorsque vous faites la même chose au niveau de la fonction, l'extension C++ prise en charge par votre compilateur (ceci n'est pas autorisé par le standard) - le compilateur émet du code qui appelle la fonction, calcule la valeur et alloue le tableau sur la pile runtime.

+0

C'est ce que je voulais vérifier. Dans une fonction ayant ceil() (ou toute autre fonction d'ailleurs) dans la déclaration de tableau ne rompt pas les sémantiques/règles du langage. Mais, dans une classe dont la taille d'un tableau dépend d'une fonction, cela casserait sizeof(). Dans ce cas, sizeof (TT) n'est pas disponible au moment de la compilation. Merci beaucoup! Appréciez votre temps! – kvs

+0

Grande réponse sharptooth. BTW, avec le compilateur Visual C++ de Microsoft, vous ne pouvez pas faire cela au niveau de la fonction. – Aamir

Questions connexes