Introduction
Si tu es développeur C, tu sais que C89 est une norme qui a jeté les bases de nombreuses pratiques de programmation modernes. Cependant, elle n'est pas sans défauts. Un de ces défauts, qui persiste jusqu'à aujourd'hui, concerne le comportement des déclarations de fonctions implicites. Cette ambiguïté n'a jamais été résolue, même avec l'arrivée de C99 qui a supprimé cette fonctionnalité. Alors, pourquoi est-ce important ? Parce que GCC et Clang, deux des compilateurs les plus utilisés, n'interprètent pas cette fonctionnalité de la même manière. Voyons cela de plus près.
Comprendre la Déclaration Implicite de Fonctions en C89
En C89, si tu appelles une fonction qui n'est pas déclarée, le compilateur ne renvoie pas immédiatement une erreur. Au lieu de cela, il la déclare implicitement comme une fonction avec des paramètres non spécifiés retournant un int. Par exemple :
``c int f(int [sizeof(f())]); ``
Dans cet exemple, f() est appelé dans le cadre d'une déclaration d'array. À ce stade, f n'est pas encore dans le scope, donc il est implicitement déclaré comme extern int (). Plus tard, f est redéclaré avec le type compatible int (int *).
L'Edge Case Amusant
Ajoutons un caractère à l'exemple précédent :
``c int f(int f[sizeof(f())]); ``
Cela semble simple, mais est-ce légal ? Selon Clang, oui, mais GCC n'est pas d'accord et renvoie une erreur. Pour clarifier, nous devons consulter la norme ANSI X.3-159-1989.
Le Cœur du Problème : "Innermost Block"
La norme C89 mentionne que si l'expression précédant la liste d'arguments entre parenthèses dans un appel de fonction ne comporte qu'un identifiant, et qu'aucune déclaration n'est visible, cet identifiant est implicitement déclaré comme extern int () dans le "innermost block". La question est de savoir ce que signifie exactement "innermost block". Cela pourrait signifier le scope de bloc ou le scope de fichier. Selon l'interprétation, le code pourrait être légal ou non.
Implications pour les Développeurs
Cette ambiguïté peut sembler mineure, mais elle a des implications réelles pour les développeurs qui maintiennent du code hérité ou qui travaillent avec des systèmes embarqués où C89 est encore utilisé. Le choix du compilateur peut affecter le comportement de ton code.
Conclusion
Bien que C99 ait supprimé les déclarations de fonctions implicites, l'ambiguïté de C89 persiste et influence encore les décisions des développeurs. Comprendre cette nuance peut t'aider à éviter des bugs subtils et à choisir le bon outil pour ton projet.
Discutons de ton projet en 15 minutes.