&引用;警告:';结构矩阵&x27;在参数列表内声明[默认启用]”;和错误:';scanToken&x27;

&引用;警告:';结构矩阵&x27;在参数列表内声明[默认启用]”;和错误:';scanToken&x27;,c,struct,gcc-warning,C,Struct,Gcc Warning,我一直在讨论这个问题,试图找出导致这些错误的原因,但到目前为止,我什么也没想到。我有这个功能: struct token scanToken(struct matrix refTable){ struct token send; int counter = 0; int currState = refTable.start; while (1) { printf("%d ", currStat

我一直在讨论这个问题,试图找出导致这些错误的原因,但到目前为止,我什么也没想到。我有这个功能:

    struct token scanToken(struct matrix refTable){
        struct token send;
        int counter = 0;
        int currState = refTable.start;
        while (1) {
                printf("%d ", currState);
                char c = getchar();
                send.buffer[counter] = c;
                int class = classifyChar(c);
                char result = refTable.grid[class][currState].action;
                currState = refTable.grid[class][currState].nextState;
                if (currState = 99){
                        findEnd();
                        send.recrej = 'd';
                        return send;
                }
                else if (currState = refTable.accept){
                        if (c == EOF){
                                send.isEnd = 't';
                        }
                        else{
                                send.isEnd = 'f';
                                send.recrej = 'a';
                        }
                }
                ++counter;
        }
        return send;
}
 struct matrix table;
        table = buildMatrix(argv[1]);
        char c;
        int class;
        struct token found;
        found = scanToken(table);
        while(found.isEnd != 't'){
                if (found.recrej == 'a'){
                        printf("recognized '%s'\n", found.buffer);
                }
                else {
                        printf("rejected\n");
                }
                found = scanToken(table);
        }
它与以下头文件匹配:

  struct token {
        char buffer[512];
        char recrej;
        char isEnd;
};


void findEnd(void);

struct token scanToken(struct matrix refTable);

int classifyChar(char c);
此代码当前在my main函数的此代码段中使用:

    struct token scanToken(struct matrix refTable){
        struct token send;
        int counter = 0;
        int currState = refTable.start;
        while (1) {
                printf("%d ", currState);
                char c = getchar();
                send.buffer[counter] = c;
                int class = classifyChar(c);
                char result = refTable.grid[class][currState].action;
                currState = refTable.grid[class][currState].nextState;
                if (currState = 99){
                        findEnd();
                        send.recrej = 'd';
                        return send;
                }
                else if (currState = refTable.accept){
                        if (c == EOF){
                                send.isEnd = 't';
                        }
                        else{
                                send.isEnd = 'f';
                                send.recrej = 'a';
                        }
                }
                ++counter;
        }
        return send;
}
 struct matrix table;
        table = buildMatrix(argv[1]);
        char c;
        int class;
        struct token found;
        found = scanToken(table);
        while(found.isEnd != 't'){
                if (found.recrej == 'a'){
                        printf("recognized '%s'\n", found.buffer);
                }
                else {
                        printf("rejected\n");
                }
                found = scanToken(table);
        }
矩阵结构在另一个头文件中进行原型化,该头文件包含在scanner.c文件(如图所示)和tokenize.c文件(如图所示)中。但是,这会产生以下警告和错误

In file included from scanner.c:10:0:
scanner.h:16:31: warning: 'struct matrix' declared inside parameter list [enabled by default]
 struct token scanToken(struct matrix refTable);
                               ^
scanner.h:16:31: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
scanner.c:60:14: error: conflicting types for 'scanToken'
 struct token scanToken(struct matrix refTable){
              ^
In file included from scanner.c:10:0:
scanner.h:16:14: note: previous declaration of 'scanToken' was here
 struct token scanToken(struct matrix refTable);

我已经搜索了相当长的一段时间,并尝试了多种方式重写内容,结果都是一样的。任何帮助都将不胜感激。谢谢。

您必须在函数原型之外声明
结构矩阵
,就像错误消息所暗示的那样

您的
scanner.h
标题中有:

struct token scanToken(struct matrix refTable);
由于该头中没有事先声明的
struct-matrix
,或者在读取之前读取了头,因此
struct-matrix
是一种新的独特类型。它也是不完整的,所以您确实需要使用指向它的指针

您可以通过以下简单方式进行修复:

struct matrix;
struct token scanToken(struct matrix *refTable);
为了能够通过值而不是指针传递
结构矩阵
,您需要结构的完整定义,但指针可以传递给不完整的类型

或者在
scanner.h
标题中包含定义结构矩阵的标题

请注意,您应该使用多个包含保护来保护标题:

#ifndef SCANNER_H_INCLUDED
#define SCANNER_H_INCLUDED

…current contents…

#endif // SCANNER_H_INCLUDED

您可以在其中添加
#包括“otherheader.h”
,即完整定义
结构矩阵
的另一个标题。

结构矩阵
的定义周围是否有任何
#ifdef
或类似内容?看起来include不起作用。没有使用ifdef。不幸的是,这可能是一个简单的修复方法,但不是原因。不过,感谢您的帮助。创建一个新的.c文件,并将所有相关代码(包括头文件)复制并粘贴到其中。如果它能工作,那么#includes就有问题了。传递完整结构的行为,而不仅仅是指向结构的指针,会导致链接器在“工作”区域分配此类结构。然后将原始结构复制到工作区(并且可能根据编写的代码复制回其“原始位置”)。我建议1)在头文件中实际定义结构矩阵的格式2)包括该头文件。3) 将两个参数传递给scanmatrix函数,一个用于当前结构,另一个用于当前返回的结构。使用空报税表。