¿Pueden las variables y funciones locales tener los mismos nombres en C?

Supongamos que tengo un solo archivo .c en el que tengo una variable local a . ¿También puedo tener una función en ese archivo c que tenga el mismo nombre a ?

EDIT: Si no, ¿por qué?

Conceptualmente, la variable local se almacena en la stack y las funciones se almacenan en la sección de texto de la memoria. Entonces no debería haber un problema, ¿verdad?

Cuando intenté esto, el comstackdor dio error. Me pregunto si esto es específico del comstackdor o si es realmente un error.

Supongo que tienes algo así:

void a (void) { // whatever } int main(void) { int a; a++; // no problem, boss a(); // <-- compiler tantrum: variable used as a function // whatever } 

El error que está recibiendo se debe al hecho de que está utilizando a como una función.

Cada vez que abre una llave, define un nuevo ámbito local, donde puede redefinir los símbolos que existen en un ámbito superior.

En ese caso, el identificador a dentro del bloque se refiere a una variable local, por lo que no puede usarlo como una función.
a at toplevel es una función, pero dentro del bloque está sombreada por la definición de la variable local con el mismo nombre.
Significa que no puede llamar a la función desde dentro de ese bloque (y cualquier otro subbloque incrustado, para el caso). (más precisamente, no puede acceder a la función a por su nombre, pero aún podría llamarlo al tener un puntero a esa función accesible desde ese ámbito)

Esto debería ser un incentivo para definir nombres significativos para sus funciones y otros símbolos globales, ya que tendrán que coexistir en el ámbito de aplicación de alto nivel y correr el riesgo de verse ensombrecidos por cualquier símbolo de scope inferior.

Como se indicó en otras respuestas, existen mecanismos en otros lenguajes como C ++ llamados "modificadores de resolución de scope" que permiten designar explícitamente el scope de un símbolo, pero que no existe en C.

No puedes porque si tienes example (), ‘example’ es un puntero a esa función.

Puede declarar variables locales con el mismo nombre que una variable global, pero la variable local ocultará el global. Siempre que su a local esté dentro del scope, el símbolo a refiere a su variable local.

Algunos idiomas permiten referirse a los símbolos globales a través de una syntax especial, como ::a o .a . C no es uno de estos idiomas.

(Como nota al margen: no debe dar nombres de funciones globales que puedan interferir con los locales. Los nombres de los locales suelen ser cortos y no contienen mucha información; no es necesario, el contexto es claro. Las variables globales tienen para compartir un gran espacio de nombres con otras variables. Se recomienda proporcionar un poco de contexto en su nombre para evitar conflictos de nombres y sombras.)

Solo para completar, hay una manera de referirse a los identificadores globales, incluso si están sombreados en C.

En el fragmento de kuroi neko, se vería así:

 void a (void) { // whatever } { int a; a++; // no problem, boss { extern void a(void); a(); // no problem either } } 

Aunque no haría eso. Utilice nombres propios en su lugar.