2017-09-17 2 views
1

Ma compréhension du type de promotion des arguments de fonction en C, est que, si j'appelle une fonction non prototypée avec un argument de type char ou short, il sera promu à un int.
Question: Que faire si je l'appelle avec un long comme argument, et sizeof(long) > sizeof(int)?Type de promotion en C, Passant un long comme un argument

Si le paramètre est passé comme long, pourquoi ne pas choisir long comme type auquel tous les paramètres intégraux doivent être promus? n'est pas la raison derrière le type de promotion des arguments, c'est de rendre les compilateurs plus simples à écrire, en rendant les paramètres poussés sur la pile de même longueur, de sorte que le système d'exécution n'a besoin que de connaître le nombre de paramètres avec leurs tailles?

+2

"si j'appelle une fonction non prototypée" Do not. Ce n'est pas ce que le type de promotion est ou est pour. Dans ce cas, le compilateur doit deviner et ne peut pas mieux deviner que "probablement int" pour tout paramètre que vous donnez. D'autre part, la promotion de type est utilisée lors du traitement d'opérations (par exemple "+", "-", ....) sur plus d'un opérande de types connus mais différents, où l'un est "plus petit" que l'autre. Le plus petit est promu au type des autres. Si vous appelez une fonction prototypée (avec un type de paramètre connu), vous pouvez obtenir la promotion de type, si le paramètre est de type "plus petit". – Yunnosch

+1

@Yunnosch "ne peut pas deviner mieux que" probablement int "", en fait il peut deviner "double" en cas de flottement. –

+0

"n'est pas la raison derrière le type de promotion des arguments, est de rendre les compilateurs plus simples à écrire" -> les promotions doivent amener les types étroits jusqu'au type "natif" (plus ou moins) entier pour le processeur plus léger/plus rapide code. – chux

Répondre

3

pourquoi ne pas choisir long ...

Parce que long n'existait lorsque le "promouvoir tout à int" design a été créé. Maintenant, changer les règles de promotion par défaut va casser à peu près tous les bits du code C existant car cela changerait aussi le comportement des appels tels que printf() et open().

Toute fonction de type varargs serait affectée - ce qui inclut open(). Il y a probablement d'autres problèmes plus subtils, mais «briser à peu près tout» est une raison suffisante pour ne pas le faire.