2009-06-22 10 views
2

Regardez le programme suivant.Que se passe-t-il lorsque nous ne spécifions pas le type de données d'arguments dans une fonction et que nous lui transmettons des paramètres en l'appelant?

int main() 
{ 
    char a=65, ch ='c'; 
    printit(a,ch); 
} 

printit(a,ch) 
{ 
    printf("a=%d ch=%c",a,ch); 
} 

Même si le type de données des arguments ne précise pas la fonction 'printit(), le résultat est représenté sur printf. Je vois la réponse correcte quand je le compile avec gcc et l'exécute. Pourquoi? N'est-il pas nécessaire de spécifier le type de données des arguments dans C? Quel est le type de données par défaut utilisé dans le cas indiqué ci-dessus?

Répondre

3

Le seul type de données par défaut supposé en C est int comme dans le code ci-dessus.

Les nouvelles versions de C++ interdisent le typage de données implicite et les plus récents compilateurs C++ refusent de compiler le code ci-dessus.

+0

Il semblerait que cela puisse également cesser de fonctionner dans les versions plus récentes de C. La norme 2005 C99 + TC1 + TC2 mentionne dans le renvoi que l'une des modifications par rapport aux versions précédentes consistait à "Supprimer la déclaration de fonction implicite". –

1

Parce que vous ne spécifiez pas de prototype pour printit(), compilateur fait jusqu'à déclaration implicite:

int printit(int, int); 

Lorsque le compilateur voit plus tard la définition de printit() fonction sans types d'arguments, il utilise cette déclaration implicite.

C'est une technique très dangereuse - vous interdisez fondamentalement la vérification de type pour cette fonction.

+0

Semble cool, mais comment pourrait-on prouver que cela fonctionne comme ça et les arguments ne sont pas plaine int? J'ai essayé de vérifier - sizeof (a) et sizeof (ch) est 4 à l'intérieur de la fonction, donc au moins avec VC++ 7 dans le mode "compiler en tant que source C" les deux arguments sont de type int. – sharptooth

+0

@sharptooth Vous avez raison - les informations de débogage montrent que printit() renvoie int et prend deux ints comme paramètres. Merci pour ce précieux commentaire, j'ai corrigé ma réponse. – qrdl