“函数”的冲突类型和函数“函数”的隐式声明在C99中无效

时间:2015-05-25 09:12:43

标签: c xcode

关于这些问题的其他答案说要在头文件中或在main()之前声明该函数,但是我有这两个并且它仍然不起作用。

#include <stdbool.h>

#ifndef WORK
#define WORK

#define TRACING true
#define DIMENSION 4
#define TOUR_LENGTH 15

void trace(char *s); //error here "Conflicting types for 'trace'"

#endif

^即头文件

void trace(char *s) //error here "Conflicting types for 'trace'"
{
    if (TRACING)
    {
        printf("%s\n",s);
    }
}

^有问题的功能。该函数在其他.c文件中多次使用#include work.h

#include <stdbool.h>
#include "work.h"
#include "gameTree.h"
#include "gameState.h"
#include "stack.h"
#include <stdio.h>


/*
    *   trace
    *   Provide trace output.
    *   Pre-condition: none
    *   Post-condition: if trace output is desired then the given String
    *                   parameter is shown on the console
    *   Informally: show the given message for tracing purposes
    *
    *   param s the String to be displayed as the trace message
*/
void trace(char *s) //error here "Conflicting types for 'trace'"
{
    if (TRACING)
    {
        printf("%s\n",s);
    }
}


/*
*   intro
*   Provide introductory output.
*   Pre-condition: none
*   Post-condition: an introduction to the progrm has been displayed
*   Informally: give the user some information about the program
*/
void intro()
{
    printf("Knight's Tour\n");
    printf("=============\n");
    printf("Welcome to the Knight's Tour.  This is played on a(n) %d x %d board.  The\n",DIMENSION,DIMENSION);
    printf("knight must move %d times without landing on the same square twice.\n",TOUR_LENGTH);
    printf("\n");
}


/*
*   main
*   Program entry point.
*   Pre-condition: none
*   Post-condition: the solution to the Knight's Tour will be found
*                   and displayed
*   Informally: solve the Knight's Tour
*/
int main(int argc, char *argv[])
    {
gameTree g,a;   // whole game tree and solution game tree
    gameState s;    // initial game state
    stack k,r;      // stack for intermediate DF use and for tracing solution
    queue q;        // queue for intermediate BF use

    // give introduction
    intro();

    // initialise data structures
    init_stack(&k);
    init_queue(&q);
    init_gameState(&s, 1, 1);   // start at top left-hand corner: (1,1)

    // show initial board
    printf("\nStarting board:\n");
    showGameState(s);
    printf("\n");

    // solve
    init_gameTree(&g, false, s, 1);
    a = buildGameDF(g, k, TOUR_LENGTH);     // Depth-first
    //a = buildGameBF(g, q, TOUR_LENGTH);   // Breadth-first

    // show results
    if (isEmptyGT(a))
    {
        printf("No solution!\n");
    }
    else
    {
        // re-trace solution from leaf to root
        init_stack(&r);
        do
        {
            push(r, a);
            a = getParent(a);
        } while (!isEmptyGT(a));

        // display move list
        while (!isEmptyS(r))
        {
            a = (gameTree)top(r);
            s = (gameState)getData(a);
            printf("Move %d: (%d,%d)\n", getLevel(a), getRow(s), getColumn(s));
            pop(r);
        }

        // display final path
        printf("\nFinal board:\n");
        showGameState(s);
    }

^整个main()和.c文件,错误主要发生在具有ADT定义的其他补充文件中,如:

gameTree getParent(gameTree t)
{
    gameTree p;

    trace("getParent: getParent starts"); //error here "Conflicting types for 'trace'" and "Implicit declaration of function 'trace' is invalid in C99"

    if (isEmptyGT(t))
    {
        fprintf(stderr, "getParent: empty game tree");
        exit(1);
    }

    init_gameTree(&p, true, NULL, -1);
    p->root = getTNParent(t->root);

    trace("getParent: getParent ends"); //error here "Conflicting types for 'trace'" and "Implicit declaration of function 'trace' is invalid in C99"
    return p;
}

^跟踪函数调用的示例。

#include <stdbool.h>
#include "tNode.h"
#include "gameTree.h"
#include "work.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

^其中一个ADT .c文件的导入

所以是的,我不知道该怎么做。

澄清work.h和work.c是该项目的主要文件。

void setChild(gameTree t, gameTree c)
{
    trace("setChild: setChild starts"); //error here "Implicit declaration of function 'trace' is invalid in C99"    
    setTNChild(t->root, c->root);

    trace("setChild: setChild ends"); //but not here
}


void setTNSibling(tNode t, tNode n)
{
    trace("setTNSibling: setTNSibling starts"); //both errors here

    t->sibling = n;

    trace("setTNSibling: setTNSibling ends"); //only the "Implicit declaration of function 'trace' is invalid in C99" error here
}

我无法确定导致某些错误的原因,但是如果导入错误的头文件,那么它是否应该一直保持一致?

我还应该注意这些文件是给我使用的,所以我没有写出原始的跟踪功能。

1 个答案:

答案 0 :(得分:0)

您的代码示例中不清楚某些源文件中是否包含<ncurses.h>。 MacOS上的trace中已经定义了一个函数<ncurses.h>

/usr/include/curses.h:1710:extern NCURSES_EXPORT(void) trace (const unsigned int);

如果这是实际问题,您需要将trace功能重命名为其他功能。

从上下文中,您可能应该使用扩展为TRACE(...)调用的宏fprintf(stderr, __VA_ARGS__),除非您为发布版本进行编译,在这种情况下它将扩展为任何内容。

警告的另一个潜在原因是原型:

void trace(char *s);

char *参数传递字符串常量可能会导致警告。由于trace不会修改字符串参数的内容,因此应将其声明为const char *。通过修改原型修复此问题:

void trace(const char *s);