Ámbito y visibilidad
La "visibilidad" de un identificador determina las partes del programa en las que se puede hacer referencia a él: su "ámbito". Un identificador solo es visible (es decir, se puede usar) en las partes de un programa incluidas en su "ámbito", que puede estar limitado (en orden de restricción creciente) al archivo, función, bloque o prototipo de función en el que aparece. El ámbito de un identificador es la parte del programa en que se puede usar el nombre. Esto a veces se denomina "ámbito léxico". Hay cuatro tipos de ámbito: función, archivo, bloque y prototipo de función.
Todos los identificadores, excepto las etiquetas, tienen su ámbito determinado por el nivel en el que se produce la declaración. Las reglas siguientes para cada clase de ámbito determinan la visibilidad de los identificadores dentro de un programa:
Ámbito de archivo
El declarador o el especificador de tipo de un identificador con ámbito de archivo aparece fuera de un bloque o una lista de parámetros y es accesible desde cualquier lugar de la unidad de traducción después de su declaración. Los nombres de identificador con ámbito de archivo a menudo se denominan "globales" o "externos". El ámbito de un identificador global comienza en el punto de su definición o declaración, y finaliza al final de la unidad de traducción.
Ámbito de función
Una etiqueta es la única clase de identificador que tiene ámbito de función. Una etiqueta se declara implícitamente por su uso en una instrucción. Los nombres de etiqueta deben ser únicos dentro de una función. (Para más información sobre las etiquetas y los nombres de etiqueta, vea Instrucciones goto y con etiquetas).
Ámbito de bloque
El declarador o el especificador de tipo de un identificador con ámbito de bloque aparece dentro de un bloque o dentro de la lista de declaraciones de parámetros formales de una definición de función. Solo es visible desde el momento de su declaración o definición hasta el final del bloque que contiene su declaración o definición. Su ámbito se limita a ese bloque y los bloques anidados en ese bloque y termina en la llave de cierre del bloque asociado. Dichos identificadores se denominan a veces "variables locales".
Ámbito de prototipo de función
El declarador o el especificador de tipo de un identificador con ámbito de prototipo de función aparece en la lista de declaraciones de parámetros en un prototipo de función (no es parte de la declaración de función). Su ámbito finaliza al final del declarador de función.
Las declaraciones apropiadas para que las variables sean visibles en otros archivos de código fuente se describen en Clases de almacenamiento. Sin embargo, las variables y las funciones declaradas en el nivel externo con el especificador de clase de almacenamiento static
solo son visibles dentro del archivo de código fuente en que se definen. Todas la demás funciones son visibles globalmente.