Portée du préprocesseur #define en C

La scope de #define jusqu’à la fin du fichier. Mais d’où ça commence? Fondamentalement, j’ai essayé le code suivant.

  #include #include #define pi 3.14 void fun(); int main() { printf("%f \n",pi); #define pi 3.141516 fun(); return 0; } void fun(){ printf("%f \n",pi);} 

Le résultat du programme ci-dessus s’avère être

 3.140000 3.141416 

En prenant en compte le prétraitement de main, la valeur de pi devrait être 3.141516 et la valeur de main en dehors de 3.14. Ceci est inexact mais veuillez expliquer pourquoi.

Le préprocesseur C parcourt le fichier de haut en bas et traite les instructions #define comme une opération de copier-coller enrichie. Une fois qu’il rencontre la ligne #define pi 3.14 , il commence à remplacer chaque instance du mot pi par 3.14 . Le pré-processeur ne traite pas (ni même ne remarque) les mécanismes de définition de la scope du langage C tels que les parenthèses et les accolades. Une fois qu’il voit un #define , cette définition est en vigueur jusqu’à ce que la fin du fichier soit atteinte, la macro n’est pas définie avec #undef ou (comme dans ce cas) la macro est redéfinie avec une autre instruction #define .

Si vous voulez des constantes qui obéissent aux règles de cadrage C, je suggère d’utiliser quelque chose de plus sur les lignes de const float pi = 3.14; .

La scope d’une #define va de l’occurrence à la fin du fichier, indépendamment des scopes C intervenantes.

Le préprocesseur n’a pas de notion de “scope” – il manipule le texte du programme, sans aucune idée de ce que le texte est

Le symbole est défini depuis sa définition jusqu’à la fin de l’unité de compilation (un fichier source et les fichiers qu’il contient).

Quand vous avez une question sur le pré-processeur:

gcc -E foo.c> foo.i; vim foo.i

Autant que je sache, le préprocesseur utilise les instructions #define dans l’ordre dans lequel il les rencontre. Dans ce cas, votre première instruction printf imprime correctement les versions 3.14 et 3.141516 (y a-t-il une faute de frappe dans la sortie de votre programme?).