2010-05-25 6 views
2

Étant donné un prototype de fonction, et une définition de type:Une simple question sur la contrainte de type en C++

int my_function(unsigned short x); 
typedef unsigned short blatherskite; 

est la situation suivante définie par la norme:

int main(int argc, char** argv) { 
    int result; 
    blatherskite b; 

    b=3; 
    result = my_function(b); 
} 

Est-ce que je reçois la contrainte de type prévisible par le prototype de fonction?

+0

Assez simple pour compiler et essayer je pense. Je crois que cela fonctionnera bien. –

+0

Seule la coercition (c'est-à-dire la conversion implicite) se produit sur la ligne 'b = 3'; 3 est un littéral de type int, converti en un short non signé pour l'assignation. Il suffit de laisser tomber la ligne pour que les gens ne soient pas troublés par cette question qui ne concerne pas la coercition mais plutôt le comportement de «typedef». –

Répondre

8

Si votre question est vraiment de savoir si les types de l'argument et le paramètre correspondent, alors la réponse est oui. typedef n'introduit pas un nouveau type, il crée seulement un alias pour un existant. La variable b a le type unsigned int, tout comme le paramètre, même si b est déclaré en utilisant le nom de type blatherskite.

Votre exemple n'est pas très bon pour le démontrer. Tous les types entiers sont convertibles en C++, donc (en ignorant les problèmes de plage) le code aurait un comportement défini même si blatherskite désignait un type différent (un nouveau type). Mais ce n'est pas le cas. Ceci est donc parfaitement valide

void foo(unsigned int* p); 
... 
blatherskite *pb = 0; 
foo(pb); // <- still valid 
+0

C'est exactement ce que je me demandais. Je suis curieux de savoir quelle autre question vous pensiez que je pourrais demander. – David

+0

Eh bien, si vous pensiez que les types ne correspondaient pas, la question pourrait être différente: est-ce que 'blatherskite' est convertible en' unsigned int'? – AnT

+0

Ah, je vois. Je crois dans ce cas que les types correspondent. C'est peut-être l'un des problèmes. Comme je l'ai noté à Jerry ci-dessous, j'ai beaucoup de surnoms qui flottent autour. Je ne sais pas si je pourrais interpréter un blatherskite comme un entier non signé, mais si je voulais interpréter un int non signé comme un blatherskite, je pourrais probablement utiliser le mot clé explicite sur un constructeur à un seul argument qui prend un entier non signé. Je suis curieux de savoir si cette conversion se produirait automatiquement dans le cas que j'ai décrit ci-dessus. Je vais demander à titre de suivi [après la réunion pour laquelle je suis en retard]. – David

3

Aucune contrainte de type n'est nécessaire. Le typedef est juste un alias pour le même type, donc vous passez un unsigned short à une fonction qui prend un unsigned short.

+0

Merci Jerry. Dans le code actuel, j'ai peut-être jusqu'à dix alias différents nommés pour un type intrinsèque particulier. Ces noms ont été tellement utilisés dans leur contexte sémantique, cela m'a fait réfléchir à la fiabilité. Il semble que cela 'fonctionne' mais la définition de 'travaux' est très floue. ['Works' peut signifier aussi peu que, "Hey, il compilé."] – David

+0

@David: yup - il a été question d'ajouter un "typedef fort" (qui créerait un nouveau type, pas seulement un alias) mais ce n'est pas encore arrivé (et peut ne jamais arriver - qui sait). –