tengo un error que dice «error: el conflicto de los tipos de ‘____’. ¿Qué significa eso?

InformationsquelleAutor user134721 | 2009-07-21

4 Comentarios

  1. 11

    Quickfix:

    Asegúrese de que sus funciones se declara una vez y sólo una vez antes de que sean llamados. Por ejemplo, cambie:

    main(){ myfun(3.4); }
    double myfun(double x){ return x; }

    A:

    double myfun(double x){ return x; }
    main(){ myfun(3.4); }

    O agregar una función separada de la declaración:

    double myfun(double x);
    main(){ myfun(3.4); }
    double myfun(double x){ return x; }

    Las posibles causas del error

    1. Función fue llamada antes de ser declarado
    2. Función definida anula una función declarada en un encabezado.
    3. Función fue definida por dos veces en el mismo archivo
    4. Declaración y definición no coinciden
    5. Declaración de conflicto en el que se incluyen los encabezados de

    Lo que realmente está pasando en

    error: conflicting types for ‘foo’ significa que una función se define más de una vez con diferentes tipo de firmas.

    Un archivo que incluye dos funciones con el mismo nombre pero con diferentes tipos de retorno iba a tirar este error, por ejemplo:

    int foo(){return 1;}
    double foo(){return 1.0;}

    De hecho, cuando se compila con GCC obtenemos los siguientes errores:

    foo.c:5:8: error: conflicting types for foo
     double foo(){return 1.0;}
            ^
    foo.c:4:5: note: previous definition of foo was here
     int foo(){return 1;}
         ^

    Ahora, si en vez de eso había un archivo con dos definiciones de función con el mismo nombre

    double foo(){return 1;}
    double foo(){return 1.0;}

    Tendríamos un ‘redefinición’ error en su lugar:

    foo.c:5:8: error: redefinition of foo
     double foo(){return 1.0;}
            ^
    foo.c:4:8: note: previous definition of foo was here
     double foo(){return 1;}
            ^

    Función implícita la declaración de

    Entonces, ¿por qué el código siguiente tiro error: conflicting types for ‘foo’?

     main(){ foo(); }
     double foo(){ return 1.0; }

    La razón es función implícita la declaración de.

    Cuando el compilador encuentra por primera vez foo() en el main la función de asumir un tipo de firma para la función foo de int foo(). De forma predeterminada, implícita se supone que las funciones devuelven enteros, y el argumento de entrada tipos se derivan de lo que está pasando en la función (en este caso, nada).

    Obviamente, el compilador está mal hacer esta suposición, pero las especificaciones de la C (y, por lo tanto Objective-C) lenguaje a viejo, malhumorado, y no muy inteligente. Quizás implícitamente declarar funciones ahorrado algo de tiempo de desarrollo mediante la reducción de compilador complejidad de vuelta en el día, pero ahora estamos atascados con un terrible característica que debe tener nunca el idioma. De hecho, implícita declaraciones fueron realizadas ilegal en C99.

    Que dijo, una vez que usted sepa lo que está pasando, debe ser fácil sacar a la causa raíz de su problema.

    • Usted también puede poner su función de definiciones en un archivo de encabezado y, a continuación, #include "yourfile.h" en el .c archivo
  2. 3

    es probablemente porque su función «_» ya existe en la biblioteca. A mi me pasó con esta función:

    Yo estaba usando stdio.h

    int getline (char s[ ] , int lim)
    {
    int c, i;

    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
    s[i] = c;
    if (c == '\n') {
    s[i] = c;
    ++i;
    }
    s[i] = '\0';
    return i;
    '
    ; return i;
    '
    ; return i;

    }

    Cuando he cambiado «getline» a «getlinexxx» y gcc compilado:

    int getlinexxx (char s[], int lim)
    {
    int c, i;

    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
    s[i] = c;
    if (c == '\n') {
    s[i] = c;
    ++i;
    }
    s[i] = '\0';
    return i;
    '
    ; return i;
    '
    ; return i;

    }

    Y el problema se había ido

    • Gracias, que trabajó para mí en mi versión antigua de SVGKit, he cambiado el nombre de método de CGPathAddRoundedRect a CGPathAddRoundedRectx porque del error: el Conflicto de los tipos de ‘CGPathAddRoundedRect'»… Gracias de nuevo
    • Sí, este era mi problema así. Cambiar el nombre de todas las ocurrencias de CGPathAddRoundedRect a CGPathAddRoundedRectX resuelto el problema. Gracias
  3. 0

    Qué tipo de datos es ‘___’?

    Mi conjetura es que usted está tratando de inicializar una variable de un tipo que no puede aceptar el valor inicial. Como diciendo int i = "hello";

    • es un NSDictionary
  4. 0

    Si usted está tratando de asignar de una llamada que devuelve un NSMutableDictionary, probablemente ese sea tu problema. La publicación de la línea de código definitivamente ayudaría a diagnosticar errores y advertencias en ella.

Dejar respuesta

Please enter your comment!
Please enter your name here