Pregunta ¿Cómo resolver la declaración estática sigue la declaración no estática en el código C de GCC?


Estoy intentando compilar el mismo archivo C en dos máquinas diferentes con diferentes versiones de cc.

gcc versión 3.2.3 dice warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc versión 4.1.2 dice error: static declaration of 'foo' follows non-static declaration

Ambos tienen el mismo CFLAGS. Me gustaría hacer que gcc 4.1.2 se comporte como gcc 3.2.3, es decir, encuentre una opción que convierta este error en una mera advertencia.


32
2018-06-30 10:15


origen


Respuestas:


De lo que se queja el mensaje de error, parece que deberías intentar arreglar el código fuente. El compilador se queja de la diferencia en la declaración, similar a, por ejemplo,

void foo(int i);
...
void foo(double d) {
    ...
}

y este no es un código C válido, por lo tanto, el compilador se queja.

Tal vez su problema es que no hay un prototipo disponible cuando la función se utiliza por primera vez y el compilador crea implícitamente uno que no será estático. Si es así, la solución es agregar un prototipo en algún lugar antes de usarlo por primera vez.


26
2018-06-30 10:31



Tratar -Wno-traditional.

Pero mejor, agregue declaraciones para sus funciones estáticas:

static void foo (void);

// ... somewhere in code
    foo ();

static void foo ()
{
    // do sth
}

4
2018-06-30 10:27



Si bien gcc 3.2.3 era más indulgente con el tema, gcc 4.1.2 resalta un problema potencialmente grave para la vinculación de su programa más adelante. En lugar de intentar suprimir el error, debe hacer que la declaración directa coincida con la declaración de la función.

Si pretendía que la función estuviese disponible globalmente (según la declaración forward), no la declare como estática. Del mismo modo, si está sangrado para que tenga un alcance local, convierta la declaración de reenvío estática para que coincida.


4
2018-06-30 10:29



He tenido este problema en un caso en el que static se llamó a la función antes de que se declarara. Mover la declaración de la función a cualquier lugar por encima de la llamada resolvió mi problema.


1
2018-05-08 09:49



Ha declarado una función no estática en algún archivo y la ha implementado como estática en otro archivo o en algún otro lugar, el mismo archivo también puede causar este problema. Por ejemplo, el siguiente código producirá este error.

void inlet_update_my_ratio(object_t *myobject);
//some where the implementation is like this
static void inlet_update_my_ratio(object_t *myobject) {
//code
}

Si elimina la estática de la implementación, el error desaparecerá de la siguiente manera.

 void inlet_update_my_ratio(object_t *myobject) {
    //code
    }

0
2017-12-21 16:10



Este error puede ser causado por un conjunto de corchetes no cerrado.

int main {
  doSomething {}
  doSomething else {
}

No es tan fácil de detectar, incluso en este ejemplo de 4 líneas.

Este error, en una función principal de 150 líneas, causó el error desconcertante: "declaración estática de 'savePair' sigue a la declaración no estática". No había nada de malo en mi definición de función savePair, era ese corchete no cerrado.


0
2018-05-11 12:04