Une simple question sur la contrainte de type en C ++
Question
Étant donné un prototype de fonction, et une définition de type:
int my_function(unsigned short x);
typedef unsigned short blatherskite;
La situation suivante définie par la norme:
int main(int argc, char** argv) {
int result;
blatherskite b;
b=3;
result = my_function(b);
}
Dois-je obtenir la contrainte de type via le prototype prévisible de fonction?
La solution
Si votre question est vraiment de savoir si les types de l'argument et le match de paramètre, alors la réponse est oui. typedef
ne présente pas un nouveau type, il ne crée que alias pour une entreprise existante. b
variable est de type unsigned int
, tout comme le paramètre, même si b
est déclaré à l'aide blatherskite
typedef-nom.
Votre exemple est pas très bon pour démontrer que, bien que. Tous les types entiers sont convertibles entre eux en C ++, donc (sans tenir compte des problèmes de portée) le code aurait un comportement défini, même si blatherskite
désigné un autre type (un nouveau type). Mais il ne fonctionne pas. Donc, c'est aussi parfaitement valide
void foo(unsigned int* p);
...
blatherskite *pb = 0;
foo(pb); // <- still valid
Autres conseils
Aucune contrainte de type est nécessaire. Le typedef est juste un alias pour le même type, de sorte que vous passez un unsigned short
à une fonction qui prend une unsigned short
.