Portée et visibilité
La « visibilité » d’un identificateur détermine les parties du programme dans lesquelles il peut être référencé, à savoir son « étendue ». Un identificateur est visible (c- à-d. qu’il peut être utilisé) uniquement dans les parties d’un programme entourées par sa « portée », qui peuvent être limitées (afin d’augmenter les restrictions) au fichier, à la fonction, au bloc ou au prototype de fonction dans lequel il apparaît. La portée d'un identificateur est la partie du programme où il peut être utilisé. On parle parfois de « portée lexicale ». Il existe quatre types d’étendues : fonction, fichier, bloc et prototype de fonction.
Tous les identificateurs exceptées les étiquettes ont leur portée déterminée par le niveau auquel la déclaration se produit. Les règles suivantes pour chaque type de portée régissent la visibilité des identificateurs à l'intérieur d'un programme :
Portée du fichier
Le spécificateur de déclarateur ou de type pour un identificateur à la portée du fichier apparaît en dehors de tout bloc ou liste de paramètres et est accessible à partir de tout emplacement dans l'unité de traduction après sa déclaration. Les noms d’identificateurs avec étendue de fichier sont souvent appelés « globaux » ou « externes ». L’étendue d’un identificateur global commence au point de sa définition ou déclaration, et se termine à la fin de l’unité de traduction.
Étendue des fonctions
Une étiquette est le seul type d'identificateur qui a une portée de fonction. Une étiquette est déclarée implicitement par son utilisation dans une instruction. Les noms d'étiquettes doivent être uniques dans une fonction. (Pour plus d'informations sur les étiquettes et les noms d'étiquettes, consultez Instructions goto et étiquetées.)
Portée de bloc
Le spécificateur de déclarateur ou de type pour un identificateur avec portée de bloc apparaît à l'intérieur d'un bloc ou dans la liste des déclarations de paramètre formel dans une définition de fonction. Il est visible uniquement à partir du point de sa déclaration ou définition à la fin du bloc qui contient sa déclaration ou définition. Sa portée est limitée à ce bloc et à tous les blocs imbriqués dans ce bloc et se termine à l'accolade qui ferme le bloc associé. Ces identificateurs sont parfois appelés « variables locales ».
Portée de prototype de fonction
Le spécificateur de déclarateur ou de type pour un identificateur avec portée de prototype de fonction apparaît dans la liste des déclarations de paramètre dans un prototype de fonction (pas dans une déclaration de fonction). Sa portée se termine à la fin du déclarateur de fonction.
Les déclarations appropriées pour rendre des variables visibles dans d'autres fichiers sources sont décrites dans Classes de stockage. Toutefois, les variables et les fonctions déclarées au niveau externe avec le spécificateur de classe de stockage static
sont visibles uniquement dans le fichier source dans lequel elles sont définies. Toutes les autres fonctions sont visibles globalement.